`
Copperfield
  • 浏览: 254875 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
C407adc3-512e-3a03-a056-ce4607c3a3c0
java并发编程陷阱
浏览量:24655
社区版块
存档分类

使用JDK动态代理及CGLIB动态代理的方法

 
阅读更多

一、使用JDK创建实现目标对象所有接口的一个代理对象。

public class JDKProxyFactory implements InvocationHandler{
	private Object targetObject;
	
	public Object createProxyInstance(Object targetObject){
		this.targetObject = targetObject;
		/**第一个参数表示目标对象类加载器,第二个参数代表目标对象实现的所有接口,第三个参数指目标对象进行方法调用时,由该对象进行拦截(调用invoke方法)**/
		return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),this.targetObject.getClass().getInterfaces(),this);
	}
	/**代理类拦截后调用该方法**/
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		PersonServiceBean personServiceBean = (PersonServiceBean)this.targetObject;
		Object result = null;
		/**代理对象将方法的访问委派给目标对象**/
		if(personServiceBean.getUser() != null){
			result = method.invoke(this.targetObject, args);
		}
		
		return result;
	}
}

 二、使用cglib创建目标对象的代理对象,该对象是目标对象的子类对象。

public class CGlibProxyFactory implements  MethodInterceptor{
	private Object targetObject;
	
	public Object createProxyInstance(Object targetObject){
		this.targetObject = targetObject;
		Enhancer enhancer = new Enhancer();
		/**产生目标类的子类,在该子类中会覆盖所有非final修饰符的方法*/
		enhancer.setSuperclass(this.targetObject.getClass());
		/**设置回调方法的对象(回调intercept方法)**/
		enhancer.setCallback(this);
		return enhancer.create();
	}
	@Override
	/**
	 * proxy  代理对象 
	 * method 拦截的方法
	 * args 方法的输入参数  methodProxy 方法的代理对象
	 */
	public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {
		PersonServiceBean personServiceBean = (PersonServiceBean)this.targetObject;
		
		Object result = null;
		/**代理对象将方法的访问委派给目标对象**/
		if(personServiceBean.getUser() != null){
			result = method.invoke(this.targetObject, args);
		}
		// TODO Auto-generated method stub
		return null;
	}
}
 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics