您的位置:首页 > 编程语言 > Java开发

java 动态代理,反射 回顾

2018-03-01 10:40 555 查看
有很多文章写的很好了,我来搬运下。
理解java反射 https://www.cnblogs.com/haodawang/p/5967185.html java动态代理 https://www.cnblogs.com/gonjan-blog/p/6685611.html
说说为什么yao用动态代理
1. 一般情况下,想要对一个现有的方法添加一些额外的操作有这样几种办法:比如:public void test(){System.out.println("hello world");}在这个方法输出hello world前添加一个log记录:(这里我们简单就输出一下)    System.out.println("log");
1.直接改源代码,直接添加代码:public void test(){    System.out.println("log");    System.out.println("hello world");}这样做非常不灵活,死板,如果有上千个方法都要添加log实现,就不行了。2.使用继承,创建一个子类继承当前类,然后调用super方法实现。class childclass extends fatherclass{    public void test(){    System.out.println("log");    super.test();}}这个比改源代码好很多,但是耦合性还是很高,一旦父类发生改变,所有的子类都要变化。同时,我如果想要把两个父类的应用合并,比如说要给另外一个类的save方法添加相同的log,我就得再写一个子类去添加log记录,因为继承永远是单线操作的,你不能同时继承两个类。3.使用组合,相当于把继承改为实现接口,因为多个类可以实现同一个接口,这样的话不同的类可以实现相互的调用。class test1 implements interfaceOriginal(){        public void test(){        System.out.println("hello world");    }}class test2 implements interfaceOriginal(){    interfaceOriginal inter = new test2(); //new 一个test2的对象    public void test(){        System.out.println("log");        inter.save();    }}如果我们想要在这基础之上把两个应用合并,比如在加上log上面再加上时间记录 System.out.println("time"); class test3 implements interfaceOriginal(){    interfaceOriginal inter2 = new test2();    public void test(){        System.out.println("time");        inter2.test();//这个test已经在前面添加了log记录。    }}注意这里的区别,继承无法给其他不是父类的类添加代码。比如这里test2 是另外一个类,他和test1之间没有相互继承,那么如果test3继承了test1,他并不能对test2添加方法。继承是单线的操作。但是这样套来套去并还不够好,如果有1000个方法需要处理,代码量还是很大。
4.这个时候就是动态代理了。动态的遍历所有方法,动态的添加想要添加的任意一个操作,比如log或者time。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: