>  기사  >  Java  >  Java 기반 리플렉션

Java 기반 리플렉션

yulia
yulia원래의
2018-09-10 16:33:591063검색

클래스 객체를 만드는 방법은 무엇인가요? 두 가지 방법이 있습니다.
class.forName("class name");
Class a = a.class;
두 방법의 차이점은 다음과 같습니다. forName()은 Class a = a.class를 초기화하는 데 도움이 됩니다. 반사, 동적 프록시를 직접 초기화해야 합니다. 즉, 객체의 메소드를 사용하여 클래스를 객체로 변경할 수 있습니다. 특정 클래스는 다른 클래스에 속합니다. 하향 변환 중 판단에 사용되는 클래스
 
클래스 객체를 통해 특정 클래스의 생성자, 멤버 변수, 멤버 메서드 및 액세스 멤버를 얻을 수 있습니다. 생성자:

class.getConstructors(); 모든 생성자를 가져옵니다. class.getConstructor(null); 이 메소드는 생성자를 반환합니다. 객체는 con.newInstance("parameters");를 통해 생성될 수 있습니다.
class.getFields(); 모든 공개 필드를 가져옵니다. ;
class.getField("name"); 특정 공개 필드(이름) 가져오기
class.getDeclaredField("phoneNum"); 특정 비공개 필드 가져오기
Return Field; f.set(obj, "Andy Lau"); 그 중 obj는 클래스에서 생성된 객체입니다.

class.getMethods(); (); 모든 메소드를 가져옵니다. class.getMethod("Method name", String.class); 다음 String.class는 메소드 매개변수를 참조합니다. do는 Field와 같습니다. 먼저 객체를 생성합니다. 여기서는 메소드 실행 함수인 Invoke()를 사용하고, 20은 매개변수입니다. () 메소드; class.getMethod("main", Stirng[].class); 리플렉션을 통해 원래 기반으로 구현할 수 있습니다. 리플렉션을 구현하고 새 클래스를 생성하고 리플렉션을 사용하여 메서드를 실행할 수 있습니다. 검사: 특정 컨테이너의 클래스 파일을 호출한 다음 일반적인 검사 문제를 피하기 위해 해당 메서드를 호출할 수도 있습니다.
또한 리플렉션을 통해 동적 프록시 모드를 구현할 수도 있습니다.

interface Subject{
    public void doSomething();
}
class RealSubject implements Subject{
    public void doSomething(){
        System.out.println("call doSomething()");    
    }
}
class ProxyHandler implements InvocationHandler{
    private Object tar;
    public Object bind(Object tar){
       this.tar = tar;
       return Proxy.newProxyInstance(tar.getClass().getClassLoader(),
                                      tar.getClass().getInterfaces(),
                                      this);
     }
     public Object invoke(Object proxy, Method method ,Object[] args) throws Throwable{
         Object result = null;
        result = method.invoke(tar,args);
        return result;
    }
}
public class Test
{
    public static void main(String[] args[]){
        ProxyHandler proxy = new ProxyHandler();
        Subject sub = (Subject) proxy.bind(new RealSubject());
        sub.doSomething();
    }
}

ProxyHandler가 사용됩니다. InvocationHandler 인터페이스를 구현하고 실제 객체를 전달하여 프록시 객체를 얻습니다. 매개변수는 다음과 같습니다. tar.getClass().getClassLoader() 실제 객체의 클래스 로더 tar.getClass().getInterfaces() 인터페이스 실제 객체, 그리고 리플렉션 메커니즘을 통해 프록시 객체를 얻는 InvocationHandler 자체와 동시에 이 프록시 객체의 메소드 실행 함수에서 실행을 위한 실제 객체를 작성합니다. 후속 메서드 호출에서 먼저 실제 개체의 메서드를 호출하려면 프록시 개체의 바인딩을 호출할 때 개체를 실제 개체로 변환해야 합니다.

위 내용은 Java 기반 리플렉션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.