使用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;
	}
}
 

 

你可能感兴趣的:(JDK动态代理)