为何使用动态代理

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。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值