디자인 모드 의 Dynamic Proxy - 동적 에이전트
동적 에이전트 (Dynamic Proxy) 는 JDK 5 가 제공 하 는 새로운 기능 입 니 다.프로그램 이 실 행 될 때 프 록 시 클래스 와 대상 을 동적 으로 만 드 는 것 이 특징 입 니 다. 우리 가 정적 프 록 시 를 사용 할 때 컴 파일 하기 전에 프 록 시 클래스 를 정의 해 야 하 는 것 이 아 닙 니 다.실행 할 때 프레임 워 크 는 여러 개의 인 터 페 이 스 를 실현 하 는 프 록 시 클래스 를 동적 으로 만 듭 니 다. 모든 프 록 시 클래스 의 대상 은 Invocation Handler 인터페이스의 실현 클래스 와 연 결 됩 니 다.우리 가 대리 대상 이 대리 하 는 인터페이스 에 있 는 방법 을 호출 했 을 때 이 호출 된 정 보 는 Invocation Handler 의 invoke 방법 에 전 달 됩 니 다.invoke 방법의 매개 변수 에서 프 록 시 대상, 방법 에 대응 하 는 Method 대상 과 호출 된 실제 매개 변 수 를 얻 을 수 있 습 니 다 (내 부 는 반사 로 이 루어 집 니 다). invoke 방법의 반환 값 은 사용자 에 게 되 돌아 가 고 어떤 값 을 되 돌려 주 는 지 는 자신 이 정의 할 수 있 습 니 다. 이런 방법 은 실제 적 으로 방법 호출 에 대해 AOP 차단 을 한 것 과 같 습 니 다.
동적 프 록 시 를 만 드 는 절 차 는 다음 과 같 습 니 다.
1. 인터페이스 Invocation Handler 를 실현 하 는 클래스 를 만 들 려 면 invoke 방법 을 실현 해 야 합 니 다.
2. 피 에이전트 클래스 및 인터페이스 만 들 기
3. 프 록 시의 정적 방법 을 통 해 new Proxy Instance (ClassLoader loader, Class [] interfaces, InvocationHandler h) 프 록 시 만 들 기
4. 프 록 시 를 통 해 호출 하 는 방법 (이 프 록 시 는 프 록 시 클래스 의 인 터 페 이 스 를 실현 합 니 다)
/**
* DynamicSubject.java
* dynamicproxy
*
* Function: , java.lang.reflect.Proxy Class,
* Interfaces ( ), , Proxy Porxy,
* InvocationHandler,
*
* ver date author
* ──────────────────────────────────
* 2011-6-12 Leon
*
* Copyright (c) 2011, TNT All Rights Reserved.
*/
package dynamicproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* ClassName:DynamicSubject
* Function: TODO ADD FUNCTION
* :
* 1. InvocationHandler , invoke 。
* 2.
* 3. Proxy newProxyInstance(ClassLoader loader,
* Class[] interfaces, InvocationHandler h)
* 4. ( )
*
*
* Reason: TODO ADD REASON
*
* @author Leon
* @version
* @since Ver 1.1
* @Date 2011-6-12
*/
public class DynamicProxy implements InvocationHandler {
private Object sub ;
public Object getSub() {
return sub;
}
public void setSub(Object sub) {
this.sub = sub;
}
public DynamicProxy(Object obj){
this.sub=obj;
}
//proxy
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
Object result = null ;
System.out.println("before calling: " + method);
//
result=method.invoke(sub, args);
System.out.println("after calling ...");
return result;
}
public static void main(String... args){
RealSubject realSubject = new RealSubject();
DynamicProxy dynamicProxy = new DynamicProxy(realSubject);
// InvocationHandler invocationHandler = dynamicProxy;
// , RealSubject DynamicPorxy ,
// $prxoy0, realSubject.getClass().getInterfaces()
ISubject subject=(ISubject)Proxy.newProxyInstance(dynamicProxy.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(),dynamicProxy);
// ,$proxy0 invocationHandler invoke , invocationHandler。
System.out.println("--------------------------Porxy realSubject1 ------------------------------------");
subject.request();
String result=subject.test();
System.out.println("return by test method :" + result);
System.out.println("--------------------------Proxy realSubject2--------------------------------------");
dynamicProxy.setSub(new RealSubject2());
subject.request();
System.out.println("proxy generate by system is :"+subject.getClass());
}
}
interface ISubject {
public void request();
public String test();
}
class RealSubject implements ISubject {
@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("From real subject...request method....");
}
@Override
public String test() {
// TODO Auto-generated method stub
String str ="From real subject.....test method.....";
return str ;
}
}
class RealSubject2 implements ISubject {
@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("From real subject2...request method....");
}
@Override
public String test() {
// TODO Auto-generated method stub
System.out.println("From real subject2 .....test method.....");
return null ;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.