目录
静态代理的内存结构图
测试demo
内存图
关于为什么不能直接修改原方法,而是要用代理
参考文章
关于代理我之前写过一篇博客,基本已经讲的差不多了,有兴趣的读者可以去看看
Java代理
最近有了新的感悟,所以记录一下
静态代理的内存结构图
测试demo
接口:明确要代理的目标类的方法
// 连接目标类和代理类的桥梁:接口
public interface Fightable {
void fight(Integer power);
}
目标类
// 静态代理目标类
public class Hero implements Fightable {
@Override
public void fight(Integer power) {
System.out.println("英雄战斗力为" + power);
}
}
代理类
public class HeroProxy implements Fightable {
private Hero hero = new Hero();
@Override
public void fight(Integer power) {
// 功能增强+访问控制
power++;
hero.fight(power);
}
}
测试运行demo
public class ToRun {
public static void main(String[] args) {
HeroProxy heroProxy = new HeroProxy();
heroProxy.fight(5);
}
}
运行结果:
内存图
其实代理的本质就是简介调用方法,我们可以通过内存图清晰的看到这一点
创建HeroProxy对象之后
执行HeroProxy对象的fight方法
关于为什么不能直接修改原方法,而是要用代理
1. 代理类有可能是外部的jar包当中的类,不能修改
2. 规范的代码习惯,单个方法只履行单个职责,同时一个方法最好不要超过80行,这样写出来的代码可读性以及可维护性(易于测试找bug,一次只测一个功能)都比较好
3. 代码耦合性太高,一旦某次新增/删除/修改的功能代码出现了bug,会导致整个方法无法被调用;如果使用代理,则最多代理方法出现问题(也就是所谓的解耦)
4. 代理可以在不修改原代码的基础上,扩展和增强实现,还能隐藏部分实现过程和细节
5. 代理具有更好的灵活性,随时可以增删改功能,还可以调换功能的增强顺序
参考文章
廖雪峰的官方网站-代理
10分钟看懂动态代理设计模式
Java程序中的代理作用和应用场景及实现