博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java动态代理的两种实现方式:
阅读量:5290 次
发布时间:2019-06-14

本文共 2745 字,大约阅读时间需要 9 分钟。

方式一:传统的代理

package cn.hc.domain;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 代理对象创建的工厂类 * @author hc * */public class JDKProxyFactory implements InvocationHandler{	//被代理对象	private Object target;	public JDKProxyFactory(Object target){		this.target=target;	}	//创建代理	public Object createProxy(){		//三个参数:类加载器 实现接口 invocationHandler		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);	}	public Object invoke(Object arg0, Method arg1, Object[] arg2)			throws Throwable {		// TODO Auto-generated method stub		//调用目标真是的方法		System.out.println("日志已经被记录");		return arg1.invoke(target, arg2);	}}

 此种方法的缺陷在于:被代理的类必须实现接口

package cn.hc.domain;//代理对象的接口public interface  UserDao {	public void save();	public void update();}package cn.hc.domain;/** * 被代理的目标对象 * @author hc * */public class UserDaoImpl implements UserDao {	public void save() {		// TODO Auto-generated method stub		System.out.println("添加用户");	}	public void update() {		// TODO Auto-generated method stub		System.out.println("更新用户");	}}//测试类package cn.hc.domain;import org.junit.Test;public class TestProxy {	@Test	public void testJdkProxy(){		//测试jdk动态代理		//1真实目标对象		UserDao userDao=new UserDaoImpl();		//System.out.println(userDao);		UserDao proxy=(UserDao) new JDKProxyFactory(userDao).createProxy();		proxy.save();		proxy.update();	}}

 测试结果:

日志已经被记录

添加用户

日志已经被记录

更新用户

 

方式2:cglib动态代理

 

package cn.hc.cglibProxy;import java.lang.reflect.Method;import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy;public class CGlibProxyFactory implements MethodInterceptor{	private Object target;	public CGlibProxyFactory(Object target){		this.target=target;	}	//创建代理对象的方法	public Object createProxy() {		//创建Enhance对象		Enhancer enhancer=new Enhancer();		//cglib创建代理,对目标对象创建子类对象		enhancer.setSuperclass(target.getClass());		//传入callback对象,对目标增强		enhancer.setCallback(this);		return enhancer.create();	}	//arg3 用于执行父类的方法	public Object intercept(Object arg0, Method arg1, Object[] arg2,			MethodProxy arg3) throws Throwable {		// TODO Auto-generated method stub		System.out.println("开始记录日志");		return arg1.invoke(target,arg2);	}}

 

package cn.hc.cglibProxy;public class ProductDao {	public void add(){		System.out.println("添加");	}	public void delete(){		System.out.println("删除");	}}//测试方法package cn.hc.cglibProxy;import org.junit.Test;public class CGlibTest {	@Test  public void test1(){	  //创建目标对象	  ProductDao dao=new ProductDao();	  ProductDao proxy=(ProductDao) new CGlibProxyFactory(dao).createProxy();	  proxy.add();	  proxy.delete();  }}

 

转载于:https://www.cnblogs.com/woolhc/p/4926329.html

你可能感兴趣的文章
动态规划--矩阵链乘法
查看>>
linux查看磁盘空间
查看>>
FrameLayout帧布局
查看>>
Android解决APP启动白屏或者黑屏闪现的问题
查看>>
CodeForces - 344B Simple Molecules (模拟题)
查看>>
Spring Web Flow 入门demo(二)与业务结合 附源代码
查看>>
Windows Phone支持数据库汇总
查看>>
C#实现Combobox自动匹配字符
查看>>
适配器模式扩展
查看>>
javase基础复习攻略《八》
查看>>
PHP删除数组指定下标的值
查看>>
超过宽度和高度文字会自动隐藏 --费元星
查看>>
Notepad++删除空行的多种实现办法
查看>>
SSH框架是个怎么回事?
查看>>
如何回报项目状态
查看>>
bootstrap3
查看>>
MySQL创建数据库和数据库表
查看>>
Codeforces Round #423 (Div. 2) C 思维,并查集 或 线段树 D 树构造,水
查看>>
Educational Codeforces Round 26 D dp,思维
查看>>
Spring Boot使用Servlet、Filter或Listener的方式
查看>>