Truy xuất vào Private Fields và Private Method trong Java

Trong Java, chúng ta không thể nào truy cập vào các private field và các phương thức có modifier là private hay protected. Tuy nhiên chúng ta có thể thực hiện qua Java Reflection.Phương pháp này rất hữu ích trong việc kiểm thử bạn cần làm các đối tượng trở nên độc lập để kiểm tra trong phạm vi của từng đối tượng.

Truy xuất vào Private Fields

Để truy xuất vào private fields bạn cần gọi phương thức Class.getDeclaredField(String name) hoặc Class.getDeclaredFields(). Các phương thức Class.getField(String name) và Class.getFields() chỉ trả về các public fields. Sau đây là một ví dụ đơn giản về class chứa private field và tiếp theo là đoạn code truy xuất vào private field thông qua Java Reflection

public class PrivateObject {
    private String privateString;

    public PrivateObject(String privateString) {
        this.privateString = privateString;
    }
}
PrivateObject privateObject = new PrivateObject("Private String");

Field privateField = PrivateObject.class.getDeclaredField("privateString");

privateField.setAccessible(true);
String value = (String) privateField.get(privateObject);
System.out.println(value);

Đoạn code này sẽ in ra dòng chữ “Private String”, đây là giá trị của private field privateString của đối tượng PrivateObject

Khi sử dụng PrivateObject.class.getDeclaredField(“privateString”), phương thức này sẽ trả về private field. Phương thức này chỉ trả về các fields được khai báo bên trong một class cụ thể và không trả về field nào được khai báo trong super class.

Bằng cách gọi Field.setAcessible(true) chúng sẽ tắt chế độ kiểm tra truy xuất của Field instance cho reflection. Bây giờ chúng ta có thể truy xuất vào nó ngay cả khi phạm vi của nó là private, protected hay là package.

Truy xuất vào Private Methods

Để truy xuất vào Private Method bạn cần gọi phương thức Class.getDeclaredMethod(String name, Class[] parameterTypes) hoặc Class.getDeclaredMethods(). Các phương thức Class.getMethod(String name, Class[] parameterTypes) và Class.getMethods() chỉ trả về phương thức public, vì vậy chúng sẽ không thực hiện được. au đây là một ví dụ đơn giản về class chứa private method và tiếp theo là đoạn code truy xuất vào private method thông qua Java Reflection.

public class PrivateObject {
    private String privateString;

    public PrivateObject(String privateString) {
        this.privateString = privateString;
    }

    private String getPrivateString() {
        return this.privateString;
    }
}
PrivateObject privateObject = new PrivateObject("Private String");

Method privateStringMethod = PrivateObject.class.
                getDeclaredMethod("getPrivateString", null);

privateStringMethod.setAccessible(true);

String value = (String)
                privateStringMethod.invoke(privateObject, null);

System.out.println(value);

Đoạn code này sẽ in ra dòng chữ “Private String”, đây là giá trị được trả về từ phương thức getPrivateString() của đối tượng PrivateObject

Khi sử dụng PrivateObject.class.getDeclaredMethod(“privateString”) phương thức này sẽ trả về phương thức private. Phương thức này chỉ trả về các phương thức được khai báo bên trong một class cụ thể và không trả về phương thức nào được khai báo trong super class.

Bằng cách gọi Method.setAcessible(true) bạn sẽ tắt chế độ kiểm tra truy xuất của Method instance cho reflection. Bây giờ chúng ta có thể truy xuất vào nó ngay cả khi phạm vi của nó là private, protected hay là package.