Отражение делает 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”