В предыдущей статье были представлены основные концепции отражения и API отражения для получения информации, связанной с классом.В этой главе в основном описывается связанный API отражения, как работать с членами класса.
Класс, который манипулирует членами класса
API отражения предоставляет следующие интерфейсы для работы с членами класса.
java.lang.reflect.Member
Интерфейс в основном имеет следующие три класса реализации, которые используются для работы с полями, методами и конструкторами в членах класса.
Советы: В руководстве по Java SE 7 указано, что конструктор не является членом класса, что отличается от значения класса реализации Member.
Поле действия
Поля имеют типы и значения.Используйте следующие классы, чтобы получить информацию о типе полей в классе, получить значения полей и присвоить значения полям.
java.lang.reflect.Field
Как работать
Методы имеют возвращаемые значения, параметры и могут вызывать исключения.Используйте следующие классы, чтобы получить информацию о типе параметров метода и возвращаемых значений, а также для вызова методов для указанных объектов.
java.lang.reflect.Method
Конструктор действий
Используйте следующие классы для управления конструктором класса, предоставляя методы, аналогичные управлению методами, со следующими двумя исключениями: конструктор не имеет возвращаемого значения, а вызов конструктора может создать экземпляр указанного класса.
java.lang.reflect.Constructor
Фактическая операция
получить тип поля
public class Main {
public static String abc = "123";
private static List<String> a;
public static void main(String[] args) throws NoSuchFieldException {
Class c = Main.class;
Field field = c.getField("abc");
Field field1 = c.getDeclaredField("a");
System.out.println(field.getType());
System.out.println(field.getGenericType());
System.out.println();
System.out.println(field1.getType());
System.out.println(field1.getGenericType());
}
}
Как показано в приведенном выше коде, получите класс Field соответствующего поля, а конкретные отличия представлены в конце предыдущей статьи. getType напрямую выводит тип класса этого поля. getGenericType напрямую выводит тип этого поля. Если это универсальное поле, он выводит тип с фактическим параметром универсального типа. Если это не универсальный тип, getType будет вызываться внутри. Результаты показаны ниже.
class java.lang.String
class java.lang.String
interface java.util.List
java.util.List<java.lang.String>
получить модификатор поля
Существует множество модификаторов для полей в классе, таких как общедоступные, частные, переходные и т. д. Java предоставляет API для получения модификатора класса, но полученное значение является числом типа int.К счастью, java предоставляет класс Modifier для выполнить полученный целочисленный тип.Суждение, как показано в следующем коде, заинтересованные могут просмотреть исходный код модификатора.
public class Main {
public static int a = 1;
public static void main(String[] args) throws NoSuchFieldException {
Class c = Main.class;
Field field = c.getField("a");
System.out.println(Modifier.isPublic(field.getModifiers()));
System.out.println(Modifier.isStatic(field.getModifiers()));
}
}
Чтение и запись значений полей
Отражение может читать и записывать поля.Как показано в следующем коде, вы можете использовать методы setX и getX для чтения и записи полей, но обратите внимание на то, совпадают ли типы до и после чтения и записи, иначе будет сообщено об исключении.
private static int a = 1;
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Class c = Main.class;
Field field = c.getDeclaredField("a");
int b = field.getInt(Main.class);
System.out.println(b);
field.setInt(Main.class, 2);
System.out.println(a);
field.setFloat(Main.class, (float) 1.1); // 报异常
}
Методы действий и конструкторы
После этого класс метода операции — Method, а класс конструктора операции — Constructor.Через метод get, предоставляемый этими API, можно получить соответствующую информацию о методе и конструкторе, поэтому я не буду их повторять. в примечаниях.
Конструктор для создания экземпляра
Разница между конструктором и классом отражения метода заключается в том, что конструктор может создать экземпляр, код выглядит следующим образом.
public class Main {
public Main() {
}
public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, InstantiationException {
Class c = Main.class;
Constructor[] ctors = c.getConstructors();
Constructor ctor = null;
for (int i = 0; i < ctors.length; i++) {
ctor = ctors[i];
if (ctor.getGenericParameterTypes().length == 0) // 需要找到默认构造函数创建实例
break;
}
System.out.println(ctor.newInstance().getClass().getCanonicalName());
}
}
конец
Выше приведены некоторые записи о просмотре API отражения. Сам инструмент очень прост в использовании, но имеет большое значение. Он является основой для существования многих фреймворков. В следующей статье в качестве примера берется struts и пишется небольшая демонстрация, чтобы показать отражение в его использовании.