註解結合反射,天衣無縫

請看示例代碼

    package com.xxd.modules.util;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.ToString;
    
    import java.lang.annotation.*;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class RefTest {
    
        public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
            Class aClass = Class.forName("com.xxd.modules.util.Student");
            Student student = (Student) aClass.newInstance();
            // 通過反射執行方法
            Method method = aClass.getDeclaredMethod("setName", String.class);
            method.invoke(student, "潤哥");
            System.out.println(student);
    
            // 通過反射獲取註解
            Annotation[] annotations = aClass.getAnnotations();
            for (Annotation annotation : annotations) {
                System.out.println(annotation);
            }
    
            // 獲取指定註解的值
            TableRun tableRun = (TableRun) aClass.getAnnotation(TableRun.class);
            String value = tableRun.value();
            System.out.println(value);
    
            // 獲取屬性中指定的註解
            Field field = aClass.getDeclaredField("name");
            FieldRun fieldRun = field.getAnnotation(FieldRun.class);
            System.out.println(fieldRun.columnName());
            System.out.println(fieldRun.type());
            System.out.println(fieldRun.length());
    
        }
    }
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    @TableRun("db_student")
    class Student {
        @FieldRun(columnName = "id", type = "int", length = 8)
        private int id;
        @FieldRun(columnName = "age", type = "int", length = 8)
        private int age;
        @FieldRun(columnName = "name", type = "varchar", length = 8)
        private String name;
    
    }
    
    // 類名的註解
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @interface TableRun {
        String value();
    }
    
    // 屬性的註解
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    @Documented
    @interface FieldRun {
        String columnName();
    
        String type();
    
        int length();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章