디자인 모드 의 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 ;
	}
}

좋은 웹페이지 즐겨찾기