동적 프록시 대상의 창설 -----------------이 코드를 이해하면 동적 프록시를 알 수 있습니다

2447 단어 j2ee

JDK 중:


java.lang.reflect 클래스 Proxy

java.lang.Object
  java.lang.reflect.Proxy

인터페이스Foo의 에이전트를 만듭니다.
     InvocationHandler handler = new MyInvocationHandler(...);
     Class proxyClass = Proxy.getProxyClass(
         Foo.class.getClassLoader(), new Class[] { Foo.class });
     Foo f = (Foo) proxyClass.
         getConstructor(new Class[] { InvocationHandler.class }).
         newInstance(new Object[] { handler });
 

또는 다음과 같은 더 간단한 방법을 사용합니다.
     Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
                                          new Class[] { Foo.class },
                                          handler);

 
//실례 테스트는 다음과 같다.
///위 부분의 복잡한 방식
Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);  Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);  Collection proxy1 = (Collection)constructor.newInstance(new InvocationHandler(){    public Object invoke(Object proxy, Method method, Object[] args)      throws Throwable {      advice.beforeMethod(method);       Object retVal = method.invoke(target, args);       advice.afterMethod(method);      return retVal;     }       });
보다 간편한 방법
 
private static Object get Proxy (final Object target,final Advice advice) {//대상 및 탄젠트 클래스 전달 Object proxy 3 = Proxy.new Proxy Instance (//new Proxy Instance 방식으로 대상 클래스의 프록시 인스턴스 대상 획득
    target.getClass().getClassLoader(),//매개 변수 1: 대상 클래스의 클래스 로더/*new Class[] {Collection.class},*/
    target.getClass().getInterfaces(),//매개변수 2: 대상 클래스의 인터페이스 클래스
new InvocationHandler () {//매개 변수 3:Handler 대상 (이 매개 변수는 '익명 내부 클래스' 를 사용합니다!)
//client 프로그램이 objProxy를 호출합니다.add ("abc") 방법은 invoke 방법을 호출하기 때문에 세 가지 요소 (즉 invoke (objProxy 대상,dd 방법, "abc"인자) 와public Object invoke (Object proxy, Method method, Object [] args) 를 포함한다./프록시 실례에서 방법을 호출하고 결과를 되돌려줍니다.메서드와 연관된 프록시 인스턴스에서 메서드를 호출하면 호출 프로세서에서 메서드 throws Throwable {
       advice.beforeMethod(method);//탄젠트 방법(AOp 마인드) Object retVal = method.invoke(target, args);//지정한 파라미터가 있는 지정한 대상에 대해 이 Method 대상이 표시하는 밑바닥 방법을 호출합니다.(즉 목표 클래스 target에 대응하는 하위 방법을 호출하는 것)advice.afterMethod(method);//커팅 방법(트랜잭션 처리, 로그 등)(AOp 마인드)return retVal;                   }     }     );   return proxy3;  }

좋은 웹페이지 즐겨찾기