자바 의 반사 응용 실현

8352 단어 자바반사 응용
반사
우 리 는 먼저 Student 클래스 를 만 들 었 다.클래스 의 구성원 변수,구조 방법,구성원 방법 공공 또는 사유 에 주의 하 십시오.

package com.reflect;

public class Student {
 //    
 public String name;//  
 private int age;//  
 
 //    
 public Student() {
 super();
 // TODO Auto-generated constructor stub
 }

 //      
 private Student(String name) {
 this.name = name;
 }
 
 public Student(String name, int age) {
 super();
 this.name = name;
 this.age = age;
 }

 //    (getXxx/setXxx)
 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;
 }

 //    
 public void study() {
 System.out.println("    java!");
 }
 //   
 private void study(String string) {
 System.out.println("     "+string);
 }
 @Override
 public String toString() {
 return "Student [name=" + name + ", age=" + age + "]";
 }
}

반사 개술
1.반사:반 사 는 class 파일 대상 을 통 해 파일 대상 의 구성원 방법,구조 방법,구성원 변 수 를 사용 하 는 것 이다.
이전에 우리 가 대상 을 사용 하 는 방법 을 회상 할 때 는 반드시 new 대상 을 통 해 사용 해 야 한다.new Student().study(),이때 우 리 는 문 제 를 발견 했다.작은 사례 에서 우 리 는 Student 류 에 study()방법 이 있다 는 것 을 알 고 있 을 것 이다.만약 에 우리 가 이런 종 류 를 사용 하고 싶 지만 유형 중의 정 보 를 잘 모 르 면 이때 반사 가 일정한 역할 을 한다.
사실 반사 작용 은 이 뿐만 이 아니다.아래 와 같다
2.반 사 는 프로그램의 유연성 과 확장 성 을 향상 시 키 고 결합 성 을 낮 추 며 자가 적응 능력 을 향상 시 킬 수 있다.프로그램 이 모든 종류의 대상 을 만 들 고 제어 할 수 있 도록 합 니 다.하 드 코딩 목표 클래스 를 향상 시 킬 필요 가 없습니다.
자바 반사 기술 응용 분야 가 매우 넓 고 후기 에 소프트웨어 테스트,자바 빈 등 이 모두 중요 한 역할 을 한다.
많은 유행 하 는 오픈 소스 프레임 워 크,예 를 들 어 Struts,Hibernate,Spring 은 실현 과정 에서 이 기술 을 사용 했다.
3.성능 문제:반 사 를 사용 하 는 것 은 기본적으로 해석 작업 으로 필드 와 방법 으로 접속 할 때 직접 코드 보다 훨씬 느리다.따라서 자바 반사 체 제 는 옳 은 것 에 만 적용 된다.유연성 과 확장 성 요구 가 높 은 시스템 구조 에서 일반 프로그램 은 반사 사용 을 권장 하지 않 고 프로그램 내부 논 리 를 모호 하 게 할 수 있다.프로그래머 는 코드 에서 프로그램의 논리,반사 등 소스 코드 를 돌아 가 는 기술 을 보고 싶 어서 유지 문 제 를 가 져 올 수 있다.
반사 클래스 대상 가 져 오기
4
  • 반 사 를 사용 하려 면 클 라 스 파일 대상,즉 우리 가 사용 하고 자 하 는 클래스 클 라 스 대상 을 받 아야 합 니 다
  • 클 라 스 파일 대상 을 얻 는 세 가지 방법:
  • Object 류 의 getClass()방법
  • 데이터 형식의 정적 속성 class클래스 클래스 의 정적 방법 public static Class forName(String classname)보통 저희 가 세 번 째 를 사용 해 요.
    
    package com.reflect;
    
    public class Demo {
     public static void main(String[] args) throws ClassNotFoundException {
     //   1
     Student p = new Student();
     Class c = p.getClass();
    
     Student p2 = new Student();
     Class c2 = p2.getClass();
    
     System.out.println(p == p2);// false    Student  
     System.out.println(c == c2);// true   class  
    
     //   2
     Class c3 = Student.class;
     System.out.println(c == c3);//true   class  
    
     //   3
     // ClassNotFoundException(     )
     Class c4 = Class.forName("com.reflect.Student");
     System.out.println(c == c4);//true   class  
     }
    
    }
    Class 클래스 와 관련 된 몇 가지 클래스
    멤버 변수 와 관련 된 Field구조 방법 과 관계 가 있다. Constructor 멤버 방법 Method 4.567917.관련 된 몇 가지 방법
  • Public T new Instance(Object...initargs)는 이 Constructor 대상 이 표시 하 는 구조 방법 으로 이 구조 방법의 성명 류 의 새로운 인 스 턴 스 를 만 들 고 지정 한 초기 화 매개 변수 로 이 인 스 턴 스 를 초기 화 합 니 다
  • 반사 획득 구조 방법
    먼저 몇 가지 방법 을 알 아 보 겠 습 니 다.
    
    public Constructor getConstructor()//         
    public Constructor[] getConstructors()//          
    public Constructor[] getDeclaredConstructors()//        
    public Constructor getDeclaredConstructor()//          
    public Constructor<T> getConstructor(Class<?>... parameterTypes)//       :                      class       
    public void setAccessible(boolean flag)//   true                Java      。     
    
    package com.reflect;
    
    import java.lang.reflect.Constructor;
    
    public class ConstructorDemo {
     public static void main(String[] args) throws Exception {
     //          
     Class c = Class.forName("com.reflect.Student");
     
     //         
     Constructor[] cons = c.getDeclaredConstructors();
     for (Constructor con : cons) {
      System.out.println(con);
     }
    
     //         
     Constructor con = c.getConstructor();//           
     Constructor con1 = c.getConstructor(String.class, int.class);//             
     Constructor con2 = c.getDeclaredConstructor(String.class);
     //     
     Object obj = con.newInstance();
     Object obj1=con1.newInstance("  ",12);
     //     
     con2.setAccessible(true);//   true                Java      。
     Object obj2 = con2.newInstance("  ");
     
     System.out.println(obj.toString());
     System.out.println(obj1.toString());
     System.out.println(obj2.toString());
     
     }
    }
    
    
     실행 결과:

    멤버 변수 반사 가 져 오기
    **위의 Constructor 클래스 의 방법 과 유사 합 니 다.이 클래스 도 같은 방법 이 있 습 니 다.모든 구성원 변 수 를 가 져 옵 니 다(배열 로 돌아 갑 니 다).개인 구성원 변 수 를 가 져 오 는 등 여기 서 더 이상 군말 하지 않 습 니 다**
    
    package com.reflect;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    
    /*
     *              
     */
    public class FieldDemo {
     public static void main(String[] args) throws Exception {
     //          
     Class c = Class.forName("com.reflect.Student");
    
     //          
      Field[] fields = c.getFields();
      Field[] fields1 = c.getDeclaredFields();
      for (Field field : fields1) {
      System.out.println(field);
      }
    
     /*
      * Person p = new Person(); p.address = "  "; System.out.println(p);
      */
    
     //             
     Constructor con = c.getConstructor();
     Object obj = con.newInstance();
     System.out.println(obj);
    
     //          
     //       
     Field nameField = c.getField("name");
     // public void set(Object obj,Object value)
     //           Field                。
     nameField.set(obj, "  "); //  obj   addressField      "  "
     System.out.println(obj);
    
     //   age     
     // NoSuchFieldException     
     Field ageField = c.getDeclaredField("age");
     // IllegalAccessException     
     ageField.setAccessible(true);
     ageField.set(obj, 18);
     System.out.println(obj);
    
     }
    }
    
    
    실행 결과:

    반사 획득 멤버 방법
    **위의 Constructor 클래스 의 방법 과 유사 합 니 다.이 클래스 도 같은 방법 이 있 습 니 다.모든 구성원 을 얻 는 방법(배열 로 돌아 가기),개인 구성원 을 얻 는 방법 등 여기 서 더 이상 군말 하지 않 습 니 다**
    
    package com.reflect;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    
    public class MethodDemo {
     public static void main(String[] args) throws Exception {
     //          
     Class c = Class.forName("com.reflect.Student");
    
     //        
      Method[] methods = c.getMethods(); //                 
      Method[] methods1 = c.getDeclaredMethods(); //           
      for (Method method : methods1) {
      System.out.println(method);
      }
    
     Constructor con = c.getConstructor();
     Object obj = con.newInstance();
     
     //          
     // public void show()
     // public Method getMethod(String name,Class<?>... parameterTypes)
     //            ,               class  
     Method m1 = c.getMethod("study");
     // public Object invoke(Object obj,Object... args)
     //     Object  ,           ,                
     m1.invoke(obj); //   obj   m1  
    
     System.out.println("----------");
     Method m2 = c.getDeclaredMethod("study", String.class);
     // NoSuchMethodException            
     m2.setAccessible(true);
     m2.invoke(obj, "  ");
     }
    }
    실행 결과:

    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기