Хотя мы обычно думаем, что можно получить доступ к частным полям и частным методам других классов через механизм отражения JAVA, это не так уж и сложно.
Примечание. Этот код будет работать только в том случае, если вы запустите его в отдельной программе JAVA, как если бы вы выполняли модульные тесты или обычную программу. Если вы попытаетесь использовать этот метод внутри JAVA-АППЛЕТА, вам придется немного изменить SecurityManager. Однако, поскольку с этим приходится сталкиваться не часто, я не буду здесь вдаваться в подробности.
Вот список этого контента:
1. Получите доступ к частным полям.
2. Доступ к частным методам.
Доступ к частным полям:
Чтобы получить доступ к закрытым полям, вам необходимо вызвать метод Class.getDeclaredField(String name) или Class.getDeclaredFields(). Методы Class.getField(String name) и Class.getFields() возвращают только общие поля, поэтому они не имеют никакого эффекта. Вот пример класса, содержащего приватные поля, а под классом находится код, который обращается к приватным полям посредством отражения.
Скопируйте код кода следующим образом:
общественный класс PrivateObject {
Private String PrivateString = null // Объявлено как частное поле;
общественный PrivateObject (String PrivateString) {
this.privateString = PrivateString;
}
}
Скопируйте код кода следующим образом:
PrivateObject PrivateObject = new PrivateObject("Частное значение");//создаем экземпляр объекта
Поле PrivateStringField = PrivateObject.class.
getDeclaredField("privateString");
PrivateStringField.setAccessible(true);//Разрешить доступ к приватным полям
String fieldValue = (String) PrivateStringField.get(privateObject);//Получить значение частного поля
System.out.println("fieldValue = " + fieldValue);
Этот код распечатает текст «fieldValue = The Private Value», который является значением частного поля PrivateString объекта PrivateObject.
Обратите внимание, что мы использовали метод PrivateObject.class.getDeclaredfield("privateString"). Именно этот вызов этого метода возвращает частное поле. Этот метод возвращает только поля на основе указанного класса и не возвращает поля, объявленные родительским классом.
Также внимательно посмотрите на выделенные жирным шрифтом утверждения. Вызывая Field.setAccessible(true), вы отключаете проверку доступа для указанного экземпляра поля, которая эффективна только для отражения. Теперь вы можете получить к нему доступ, независимо от того, является ли он частным, защищенным или по умолчанию, даже если вызывающий объект не находится в этой области. Вы по-прежнему не можете получить доступ к полю обычными методами, поскольку компилятор этого не позволяет.
Доступ к частным методам <BR>Чтобы получить доступ к частному методу, вам необходимо вызвать метод Class.getDeclaredMethod(имя строки, типы параметров класса[]) или Class.getDeclaredMethods(). Методы Class.getMethod(String name,Class[]parameterTypes) и Class.getMethods() возвращают только общедоступные методы, поэтому они не будут играть никакой роли. Ниже приведен простой пример класса с частными методами. Ниже класса приведен код, который обращается к частным методам посредством отражения.
Скопируйте код кода следующим образом:
общественный класс PrivateObject {
частная строка PrivateString = null;
общественный PrivateObject (String PrivateString) {
this.privateString = PrivateString;
}
частная строка getPrivateString(){//Частный метод
верните this.privateString;
}
}
Скопируйте код кода следующим образом:
PrivateObject PrivateObject = новый PrivateObject («Частное значение»);
Метод PrivateStringMethod = PrivateObject.class.
getDeclaredMethod("getPrivateString", null);
PrivateStringMethod.setAccessible(истина);
Строка returnValue = (Строка)
PrivateStringMethod.invoke(privateObject, null);
System.out.println("returnValue = " + returnValue);
В этом примере кода выводится текст «returnValue = The Private Value», который является возвращаемым значением частного метода.