Рубрики
Без рубрики

JAVA 001 Аннотация и отражение

Фоновое отражение делает Java полудинамичным языком. Вряд ли мы используем отражение в… Помеченный java.

Отражение делает Java полудинамичным языком. Вряд ли мы используем отражение в нашей программе разработки Java, оно предоставляет нам альтернативный способ создания объекта. Обычно мы используем new ключевое слово или clone() метод для создания экземпляров. С помощью размышления у нас может быть третий путь.

Что касается аннотаций, то мы часто видим их в таких фреймворках, как spring. Я полагаю, что большинство фреймворков, имеющих аннотации, используют отражение для получения аннотации в нашем коде.

Аннотация похожа на класс, но у нее есть только атрибуты. Мы можем использовать @interface для объявления аннотаций:

// Self-defined annotations:

// The table name
@Target(value=ElementType.TYPE)
@Retention(value=RetentionPolicy.RUNTIME)
@interface AnnoTable {
    // 注解的参数: 参数类型 参数名()
    String value();
}

// The field information
@Target(value=ElementType.FIELD)
@Retention(value=RetentionPolicy.RUNTIME)
@interface AnnoField {
    String fieldName();
    String dataType();
    int length();
}

Теперь давайте определим класс и используем наши аннотации для его описания:

@AnnoTable("researchers")
class Researcher {

    @AnnoField(fieldName = "rid", dataType = "int", length = 11)
    private int id;

    @AnnoField(fieldName = "age", dataType = "int", length = 11)
    private int age;

    @AnnoField(fieldName = "name", dataType = "varchar", length = 30)
    private String name;

    public Researcher() {
    }
    public Researcher(int id, int age, String name) {
        super();
        this.id = id;
        this.age = age;
        this.name = name;
    }

    // ... getters and setters
}
public class TestMyAnnotation {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {

        // 通过反射获得注解
        Class c1 = Class.forName("annotation.Researcher");
        Annotation[] as = c1.getAnnotations();
        for(Annotation a: as) {
            System.out.println(a);
        }

        // 获得注解中的值
        AnnoTable annotable = (AnnoTable) c1.getAnnotation(AnnoTable.class);
        String value = annotable.value();
        System.out.println(value);

        // only public fields can be got by getField() method
        // private fields should use getDeclaredField()
        Field f = (Field) c1.getDeclaredField("id");
        AnnoField annoField = (AnnoField) f.getAnnotation(AnnoField.class);
        System.out.println(annoField.fieldName());
        System.out.println(annoField.dataType());
        System.out.println(annoField.length());
    }
}

Оригинал: “https://dev.to/declair/java001-annotation-and-reflection-4dnc”