Java 반사 메커니즘 및 Method.invoke 상세 정보

JAVA 반사 메커니즘
JAVA 반사 메커니즘은 운행 상태에서 임의의 클래스에 대해 이 클래스의 모든 속성과 방법을 알 수 있다.임의의 대상에 대해 임의의 방법을 사용할 수 있다.이런 동적 얻은 정보와 동적 호출 대상의 방법의 기능을 자바 언어의 반사 메커니즘이라고 부른다.
자바 반사 메커니즘은 주로 다음과 같은 기능을 제공한다. 실행할 때 임의의 대상이 속한 클래스를 판단하는 것이다.운행할 때 임의의 종류의 대상을 구성한다.운행할 때 임의의 종류가 가지고 있는 구성원 변수와 방법을 판단한다.실행할 때 임의의 대상을 호출하는 방법;동적 에이전트를 생성합니다.
1. 어떤 대상의 속성을 얻기

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에 보고합니다.
2. 어떤 종류의 정적 속성 얻기

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): 우선 이 클래스의 클래스를 받습니다.
Field field = ownerClass.getField(fieldName): 위와 같이 클래스를 통해 클래스 성명의 속성을 얻을 수 있습니다.
Object property = field.get(ownerClass): 여기는 위와 약간 다릅니다. 이 속성은 정적이기 때문에 클래스의 클래스에서 직접 가져옵니다.
3. 어떤 대상을 실행하는 방법

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 method = ownerClass.getMethod(methodName,argsClass): methodName과 매개 변수의argsClass(방법의 매개 변수 형식 집합) 그룹을 통해 실행할 Method를 얻을 수 있습니다.
method.invoke(owner,args): 이 메서드를 실행합니다.invoke 방법의 매개 변수는 이 방법을 실행하는 대상 owner와 매개 변수 그룹args입니다. 이렇게 이해할 수 있습니다. owner 대상에 매개 변수args가 있는method 방법입니다.반환 값은 Object 또는 메서드의 반환 값입니다.
4. 어떤 종류의 정적 방법을 실행한다

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입니다. 이것은 정적 방법이기 때문에 실례를 빌려 운행할 필요가 없습니다.
5. 새 인스턴스

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); 
  

여기서 말하는 방법은 매개 변수를 가진 구조 함수를 실행하여 새로운 실례를 만드는 방법이다.매개 변수가 필요하지 않으면 newone Class를 직접 사용할 수 있습니다.newInstance () 를 참조하십시오.
Class newoneClass = Class.forName(className): 첫 번째 단계에서 구성할 실례적인 클래스를 얻습니다.
5~9행: 파라미터를 얻은 클래스 그룹.
Constructor cons = newoneClass.getConstructor(argsClass): 구조자를 얻습니다.
cons.newInstance(args): 새 인스턴스입니다.
6. 어떤 종류의 실례인지 판단

public boolean isInstance(Object obj, Class cls) { 
     return cls.isInstance(obj); 

7. 수조의 어떤 원소를 얻는다

public Object getByArray(Object array, int index) { 
     return Array.get(array,index); 

좋은 웹페이지 즐겨찾기