https://www.bilibili.com/video/BV1ue411N7GX
什么是代理
- 自己的理解:
类似与Spring中的AOP,是对原有代码的增强,也是对原有代码的封装
- 官话:
在Java中,代理(Proxy)是一种设计模式,用于控制对某个对象的访问。代理模式通过创建一个代理对象,来替代原始对象,以实现对原始对象的访问控制。代理对象和原始对象实现相同的接口,客户端对象可以透明地使用代理对象。
例子
实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class BigStar implements Star {
private String name;
public BigStar(String name) { this.name = name; }
public String sing(String song) { System.out.println(this.name + " 正在唱:" + song); return "谢谢"; }
public String dance(String dance) { System.out.println(this.name + "正在跳:" + dance); return "谢谢"; } }
|
接口
1 2 3 4 5 6
| public interface Star {
public String sing(String name);
public String dance(String name); }
|
动态代理类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public class ProxyUtil {
public static Star createProxy(BigStar bigStar) { Star starProxy = (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), new Class[]{Star.class}, new InvocationHandler() {
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("sing")) { System.out.println("唱歌,花费10万"); } else if (method.getName().equals("dance")) { System.out.println("跳舞,花费20万"); } return method.invoke(bigStar, args); } }); return starProxy; }; }
|
运行代码
1 2 3 4 5
| BigStar bigStar = new BigStar("nick"); Star star = ProxyUtil.createProxy(bigStar); System.out.println(star); System.out.println(star.sing("mick")); System.out.println(star.dance("sas"));
|
运行结果

打印出star,发现还是实体类,证实了动态代理是对原有代码的封装与加强
运行流程
