Заметки по Java — отражение Java (2)

Java задняя часть API

В предыдущей статье были представлены основные концепции отражения и 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 и пишется небольшая демонстрация, чтобы показать отражение в его использовании.