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