자바 동적 - 반사 메커니즘 학습 노트

7840 단어 자바 수필
자바 동적 포함:
  • 반사 메커니즘
  • 동적 컴 파일
  • 자 바스 크 립 트 코드 동적 실행
  • 동적 바이트 코드
  • 동태 적 이해
  • 프로그램 이 실행 되 는 과정 에서 (컴 파일 이 아 닌) 대상 을 동적 으로 만 들 고 조작 합 니 다
  • 동적 언어:
  • python
  • javascript

  • 비 동적 언어:
  • c 언어
  • c++
  • 자바 (동적 언어 는 아니 지만 일정한 동적)
  • 자바 반사 메커니즘 의 간단 한 사용 예
    사용자 정의 설명:
    @Target(value = {ElementType.TYPE}) //       
    @Retention(RetentionPolicy.RUNTIME) //           
    public @interface Table {
        String value();
    }
    
    @Target(value = {ElementType.FIELD}) //         
    @Retention(RetentionPolicy.RUNTIME) //           
    public @interface AnnoField {
        String colName();
        String type();
        int length();
    }
    

    테스트 클래스 정의:
    @Table("student")
    public class Student {
    
        @AnnoField(colName="name",type="varchar",length=10)
        private String name;
        @AnnoField(colName="age",type="int",length=3)
        private int age;
    
        public Student(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
        public Student() {
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    }
    

    반사 메커니즘 을 통 해 클래스 의 속성, 방법 과 구조 기 를 얻다
    @SuppressWarnings("all")
    public class TestReflection {
        public static void main(String[] args) {
            try {
                //  class  
                Class clazz = Class.forName("com.test.reflection.Student");
    
                //      
                Field[] fs = clazz.getDeclaredFields(); //             public    getFields()
                for(Field f : fs) {
                    System.out.println(f);
                    AnnoField field = f.getAnnotation(AnnoField.class);//       
                    System.out.println("  :"+field.colName());
                }
    
                //      
                Method[] ms = clazz.getDeclaredMethods(); //       
                for(Method m : ms) {
                    System.out.println(m);
                }
                Method m1 = clazz.getDeclaredMethod("setName", String.class);//        ,             
                System.out.println(m1);
    
                //       
                Constructor[] cs = clazz.getDeclaredConstructors();
                for(Constructor c : cs) {
                    System.out.println(c);
                }
    
                //      
                Annotation[] annos = clazz.getDeclaredAnnotations();
                for(Annotation anno : annos) {
                    System.out.println("    "+anno);
                }
    
    
            }catch (Exception e) {
            }
        }
    }
    

    반사 메커니즘 을 통 해 클래스 생 성 및 조작 속성 과 방법
    @SuppressWarnings("all")
    public class TestReflection2 {
        public static void main(String[] args) {
            try {
                //  class  
                Class clazz = Class.forName("com.test.reflection.Student");
    
                //    API       
                Student stu1 = (Student) clazz.newInstance();
                //    API       
                Constructor c = clazz.getConstructor(String.class,int.class);
                Student stu2 = (Student) c.newInstance("  ",12);
                System.out.println(stu2.getAge());
    
                //    API    
                Method m1 = clazz.getMethod("setName", String.class);//     
                m1.invoke(stu1, "  ");
                System.out.println(clazz.getMethod("getName", null).invoke(stu1, null));
    
                //    API    
                Field f1 = clazz.getDeclaredField("age");
                f1.setAccessible(true); //      ,           。         
                f1.set(stu1, 13);
                System.out.println(stu1.getAge());
    
            }catch (Exception e) {
            }
    
    
        }
    }

    좋은 웹페이지 즐겨찾기