JAVA 의 JDK 동적 에이전트

4984 단어 자바AOPjdk
자바 의 자바.lang.reflect 패키지 에 프 록 시 클래스 와 InvocationHandler 인 터 페 이 스 를 제공 합 니 다.이 클래스 와 인 터 페 이 스 를 통 해 JDK 동적 프 록 시 클래스 나 동적 프 록 시 대상 을 생 성 할 수 있 습 니 다.프 록 시 는 동적 프 록 시 클래스 와 프 록 시 대상 을 만 드 는 정적 방법 을 제공 합 니 다.모든 동적 프 록 시 클래스 의 부모 클래스 이기 도 합 니 다.프로그램 에서 하나 이상 의 인터페이스 동적 생 성 실현 클래스 를 만 들 려 면 프 록 시 를 사용 하여 동적 프 록 시 클래스 를 만 들 수 있 습 니 다.하나 이상 의 인터페이스 동적 생 성 인 스 턴 스 가 필요 하 다 면 프 록 시 를 사용 하여 동적 프 록 시 인 스 턴 스 를 만 들 수도 있 습 니 다.Proxy 는 동적 프 록 시 클래스 와 동적 프 록 시 인 스 턴 스 를 만 드 는 두 가지 방법 을 제공 합 니 다.getProxyClass(ClassLoader loader, Class... interfaces)동적 프 록 시 클래스 에 대응 하 는 Class 대상 을 만 듭 니 다.이 프 록 시 클래스 는 interfaces 가 지정 한 여러 개의 인 터 페 이 스 를 실현 합 니 다.첫 번 째 ClassLoader 매개 변 수 는 동적 프 록 시 클래스 를 생 성 하 는 클래스 로 더 를 지정 합 니 다.newProxyInstance(ClassLoader loader, Class[] interfaces,InvocationHandler h)는 동적 프 록 시 대상 을 직접 만 듭 니 다.이 프 록 시 대상 의 실현 클래스 는 interfaces 가 지정 한 시리즈 인 터 페 이 스 를 실현 합 니 다.프 록 시 대상 을 실행 하 는 모든 방법 은 InvocationHandler 대상 을 실행 하 는 invoke 방법 으로 대 체 됩 니 다.실제로 첫 번 째 방법 으로 동적 프 록 시 클래스 를 얻 은 후에 도 프로그램 이 이 프 록 시 클래스 를 통 해 대상 을 만들어 야 할 때 처럼 Invocation Handler 대상 을 입력 해 야 한다.즉,시스템 이 생 성 된 모든 프 록 시 대상 은 이와 관련 된 Invocation Handler 대상 이 있다 는 것 이다.코드 데모:

package com.qin.aop;

/**
 *      AOP
 *    ,            
 * 
 * **/
public class DogUtils {
	
/**
 * 
 *          
 * 
 * **/
	public void method1(){
		
		System.out.println("=======          ==========");
		
	}
	
	
	/**
	 * 
	 *          
	 * 
	 * **/
		public void method2(){
			
			System.out.println("=======          ==========");
			
		}
	
	

}


Dog 인터페이스,JDK 동적 에이 전 트 는 인터페이스 에 만 에이 전 트 를 생 성 할 수 있 습 니 다.
package com.qin.proxy;

/***
 * 
 *   Dog  
 * */
public interface Dog {

	/**
	 * 
	 *        
	 * **/
public 	void info();
	
	
	/**
	 *       
	 * 
	 * */
public	void run();
	
	
	
	
	
}
package com.qin.proxy.impl;

import com.qin.proxy.Dog;

/**
 * 
 *    
 * **/
public class GunDog implements Dog {

	@Override
	public void info() {
		System.out.println("      !  ");
		
	}

	@Override
	public void run() {
		
		System.out.println("     !");
		
	}

	
	
	
	
}
package com.qin.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

import com.qin.aop.DogUtils;

 

/**
 *            
 * 
 * 
 * **/
public class MyInvokationHandler  implements InvocationHandler{

	/*
	 *         
	 * **/
	private Object obj;
	
	
	
	 
	public void setObj(Object obj) {
		this.obj = obj;
	}




	/**
	 *               ,
	 *          invoke  
	 * 
	 * ***/
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
	 DogUtils du=new DogUtils();
	 //  DogUtils    method1  
	 du.method1();
	 // target       method  
	 Object  result=method.invoke(obj, args);
	 du.method2();
		return result;
	}

	 

	
	
}
package com.qin.proxy;

import java.lang.reflect.Proxy;


/**
 *        target        
 * 
 * **/
public class MyProxyFactory  {
	
	public static Object getProxy(Object obj){
		
		//    MyInvokationHandler  
		MyInvokationHandler hadler=new MyInvokationHandler();
		
		hadler.setObj(obj);
		//           
		
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), hadler);
		
	} 
	

}

테스트:
package com.qin.test;

import com.qin.proxy.Dog;
import com.qin.proxy.MyProxyFactory;
import com.qin.proxy.impl.GunDog;

/**
 * 
 *       
 * **/
public class Test {

	
	
	
	public static void main(String[] args) {
		Dog target=new GunDog();
		  
		Dog dog=(Dog)MyProxyFactory.getProxy(target);
		 
		dog.info();
		dog.run();
		
		
	}
	
}

결과 출력 은 다음 과 같 습 니 다:
=======          ==========
      !  
=======          ==========
=======          ==========
     !
=======          ==========

좋은 웹페이지 즐겨찾기