java 반사 메커니즘 설명 및 Method.invoke의 해석

4135 단어
1JAVA 반사 메커니즘 JAVA 반사 메커니즘은 운행 상태에서 임의의 클래스에 대해 이 클래스의 모든 속성과 방법을 알 수 있다.임의의 대상에 대해 임의의 방법을 사용할 수 있다.이런 동적으로 얻은 정보와 동적 호출 대상의 방법의 기능을 자바 언어의 반사 메커니즘이라고 한다.자바 반사 메커니즘은 주로 다음과 같은 기능을 제공한다. 실행할 때 임의의 대상이 속한 클래스를 판단한다.운행할 때 임의의 종류의 대상을 구성한다.운행 시 임의의 클래스가 가지고 있는 구성원 변수와 방법을 판단한다.실행할 때 임의의 대상을 호출하는 방법;동적 프록시를 생성합니다.
  • 객체에 대한 속성 Java 코드 가져오기
  • public Object getProperty(Object owner, String fieldName) throws Exception {  
         Class ownerClass = owner.getClass();  
       
         Field field = ownerClass.getField(fieldName);  
       
         Object property = field.get(owner);  
       
         return property;  
    }  
    

    Class ownerClass = owner.getClass(): 객체의 Class를 받습니다.Field field = ownerClass.getField(fieldName): 클래스 선언의 속성을 클래스에서 가져옵니다.Object property = field.get(owner): 대상을 통해 이 속성의 실례를 얻을 수 있습니다. 만약 이 속성이 비공유적이라면 IllegalAccessException에 보고합니다.
  • 특정 클래스의 정적 속성 자바 코드 가져오기
  • public Object getStaticProperty(String className, String fieldName)  
                 throws Exception {  
         Class ownerClass = Class.forName(className);  
       
         Field field = ownerClass.getField(fieldName);  
       
         Object property = field.get(ownerClass);  
       
         return property;  
    }  
    

    Class ownerClass = Class.forName (className): 이 클래스의 Class를 먼저 가져옵니다.Field field = ownerClass.getField (fieldName): 클래스 성명의 속성을 위에서 설명한 것과 같습니다.Object property = field.get(ownerClass): 여기는 위와 약간 다르다. 이 속성은 정적이기 때문에 클래스의Class에서 직접 가져온다.
  • 객체를 실행하는 방법 Java 코드
  • public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {  
       
         Class ownerClass = owner.getClass();  
       
         Class[] argsClass = new Class[args.length];  
       
         for (int i = 0, j = args.length; i < j; i++) {  
             argsClass[i] = args[i].getClass();  
         }  
      
          Method method = ownerClass.getMethod(methodName,argsClass);  
       
         return method.invoke(owner, args);  
    }  
    

    Class owner_class = owner.getClass (): 우선 이 대상의 Class를 받아야 합니다.5~9줄: Method를 찾는 조건으로 매개 변수의 Class 그룹을 설정합니다.Method method = ownerClass.getMethod (methodName,argsClass):methodName과 매개 변수의argsClass (방법의 매개 변수 형식 집합) 그룹을 통해 실행할 Method를 얻습니다.method.invoke(owner,args): 이 Method를 실행합니다.voke 방법의 매개 변수는 이 방법을 실행하는 대상 owner와 매개 변수 그룹args입니다. 이렇게 이해할 수 있습니다. owner 대상에 매개 변수args가 있는method 방법입니다.반환 값은 Object이며 메서드의 반환 값이기도 합니다.
  • 특정 클래스를 실행하는 정적 방법 자바 코드
  • public Object invokeStaticMethod(String className, String methodName,  
                 Object[] args) throws Exception {  
         Class ownerClass = Class.forName(className);  
       
         Class[] argsClass = new Class[args.length];  
       
         for (int i = 0, j = args.length; i < j; i++) {  
             argsClass[i] = args[i].getClass();  
         }  
       
        Method method = ownerClass.getMethod(methodName,argsClass);  
       
         return method.invoke(null, args);  
     }  
    

    기본적인 원리는 실례 3과 같고 차이점은 마지막 줄이며 invoke의 매개 변수는null이다. 이것은 정적 방법이기 때문에 실례를 빌려 운행할 필요가 없다.
  • 새 인스턴스 Java 코드
  • public Object newInstance(String className, Object[] args) throws Exception {  
         Class newoneClass = Class.forName(className);  
       
         Class[] argsClass = new Class[args.length];  
       
         for (int i = 0, j = args.length; i < j; i++) {  
             argsClass[i] = args[i].getClass();  
         }  
       
         Constructor cons = newoneClass.getConstructor(argsClass);  
       
         return cons.newInstance(args);  
       
    }  
    

    여기서 말하는 방법은 매개 변수를 가진 구조 함수를 실행하여 새로운 실례를 만드는 방법이다.매개 변수가 필요하지 않으면 newoneClass를 직접 사용할 수 있습니다.newInstance()를 사용하여 수행할 수 있습니다.Class newoneClass = Class.forName (className): 첫 번째 단계는 구성할 실례를 얻는 Class입니다.
    5~9행: 매개 변수를 얻은Class 그룹.Constructor cons = newoneClass.getConstructor(argsClass): 구조자를 얻습니다.cons.새 인스턴스
  • 특정 클래스의 실례 자바 코드인지 판단
  • public boolean isInstance(Object obj, Class cls) {  
         return cls.isInstance(obj);  
    }  
    
  • 배열의 요소 자바 코드 가져오기
  • public Object getByArray(Object array, int index) {  
         return Array.get(array,index);  
    }  
    

    ... 에서 벗어나다http://azrael6619.iteye.com/blog/429797

    좋은 웹페이지 즐겨찾기