Java动态代理实现方法小结
程序员文章站
2024-02-18 21:26:58
本文实例讲述了java动态代理实现方法。分享给大家供大家参考,具体如下:
静态代理了解的差不多了,但是对于动态代理理解的还不是很通透,这里先把一些常用的动态代理实现方法记...
本文实例讲述了java动态代理实现方法。分享给大家供大家参考,具体如下:
静态代理了解的差不多了,但是对于动态代理理解的还不是很通透,这里先把一些常用的动态代理实现方法记录下来,日后时常看看争取早日融会贯通。
1、jdk实现动态代理
主要使用了proxy.newproxyinstance()方法,该方法的官方解释为:返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
public interface isomeservice { string dofirst(); void dosecond(); string dothird(); } //目标类:代理类要增强的类 public class someserviceimpl implements isomeservice { @override public string dofirst() { return "aaabbb"; } @override public void dosecond() { system.out.println("someserviceimpl:执行dosecond()"); } @override public string dothird() { return "aaa"; } } public class mytest { public static void main(string[] args) { isomeservice target = new someserviceimpl(); isomeservice someservice = (isomeservice) proxy.newproxyinstance( target.getclass().getclassloader(), target.getclass().getinterfaces(), new invocationhandler() { // proxy:代理对象 // method:目标方法 // args:目标方法的参数列表 @override public object invoke(object proxy, method method, object[] args) throws throwable { object result = method.invoke(target, args); if(result!=null) { result=((string)result).touppercase(); } return result; } }); system.out.println(someservice.dofirst()); someservice.dosecond(); system.out.println(someservice.dothird()); } }
2、cglib实现动态代理(没接口)
使用jdk的proxy实现动态代理,要求目标类与代理类实现相同的接口,若目标类不存在接口,则无法使用该方式实现。
对于没有接口的类,要为其创建动态代理,就要使用cglib来实现。cglib动态代理的生成原理是生成目标类的子类,而子类是增强过的,这个子类对象就是代理对象。使用cglib生成代理类,要求目标类必须能被继承,因此不能是final类。
//目标类:代理类要增强的类 public class someservice { public string dofirst() { system.out.println("someserviceimpl:执行dofirst()"); return "aaabbb"; } public void dosecond() { system.out.println("someserviceimpl:执行dosecond()"); } } //注意:使用cglib动态代理,要求目标类不能是final的 //cglib动态代理的增强原理是:子类增强父类,所以目标类必须能被继承 public class cglibfactory implements methodinterceptor { private someservice target; public cglibfactory() { } public cglibfactory(someservice target) { this.target = target; } public someservice mycglibcreator() { enhancer enhancer = new enhancer(); //指定父类,即目标类。因为cglib动态代理增强的原理是:子类增强父类 enhancer.setsuperclass(someservice.class); //设置回调接口对象 enhancer.setcallback(this); //create()方法用于创建cglib动态代理对象 return (someservice)enhancer.create(); } //回调函数的执行条件:代理对象执行目标方法时会触发该方法 @override public object intercept(object obj, method method, object[] args, methodproxy proxy) throws throwable { object invoke = method.invoke(target, args); if(invoke!=null) { invoke=((string)invoke).touppercase(); } return invoke; } } public class mytest { public static void main(string[] args) { someservice target = new someservice(); someservice proxy = new cglibfactory(target).mycglibcreator(); proxy.dofirst(); } }
3、cglib实现动态代理(有接口)
在有接口的情况下利用cglib实现动态代理跟没有接口的情况下利用cglib实现动态代理,其实差不多。
public interface isomeservice { string dofirst(); void dosecond(); string dothird(); } //目标类:代理类要增强的类 public class someservice implements isomeservice { public string dofirst() { return "aaabbb"; } public void dosecond() { system.out.println("someserviceimpl:执行dosecond()"); } @override public string dothird() { return "third"; } } //注意:使用cglib动态代理,要求目标类不能是final的 //cglib动态代理的增强原理是:子类增强父类,所以目标类必须能被继承 public class cglibfactory implements methodinterceptor { private isomeservice target; public cglibfactory() { } public cglibfactory(isomeservice target) { this.target = target; } public isomeservice mycglibcreator() { enhancer enhancer = new enhancer(); //指定父类,即目标类。因为cglib动态代理增强的原理是:子类增强父类 enhancer.setsuperclass(isomeservice.class); //设置回调接口对象 enhancer.setcallback(this); //create()方法用于创建cglib动态代理对象 return (isomeservice)enhancer.create(); } //回调函数的执行条件:代理对象执行目标方法时会触发该方法 @override public object intercept(object obj, method method, object[] args, methodproxy proxy) throws throwable { object invoke = method.invoke(target, args); if(invoke!=null) { invoke=((string)invoke).touppercase(); } return invoke; } } public class mytest { public static void main(string[] args) { isomeservice target = new someservice(); isomeservice proxy = new cglibfactory(target).mycglibcreator(); system.out.println(proxy.dofirst()); proxy.dosecond(); system.out.println(proxy.dothird()); } }
更多java相关内容感兴趣的读者可查看本站专题:《java面向对象程序设计入门与进阶教程》、《java数据结构与算法教程》、《java操作dom节点技巧总结》、《java文件与目录操作技巧汇总》和《java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
上一篇: Oracle trim函数用法详解