동적 프록시 대상의 창설 -----------------이 코드를 이해하면 동적 프록시를 알 수 있습니다
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; }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Field error in object ** on field **org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors Field e...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.