代理模式
代理角色,被代理的角色(目标对象),由被代理角色来做最终的决定
代理角色通常来说会持有被代理角色对象的引用
获取到目标对象的引用,并且能够调用到目标类的业务方法
静态代理
代理类:获取目标类的引用(具体的类的引用)
目标类:做决定的方法(具体的类);做决定的方法;
代理类
目标类
动态代理
动态代理类:获取目标类的引用(可以是个接口)
目标类:实现接口的类
代理类需要实现 InvocationHandler 类,并实现 invoke方法,方法增强也就是在这个invoke方法里面做;
代理类可以是接口,也可以是普通的类
调用
区别
静态代理,在代理之前,所有的东西都是已知的
动态代理,在代理之前,所有的东西都是未知的
Cglib
目标类:普通的类
代理类: implements MethodInterceptor 接口 Override intercept方法
Jdk 中,一般$ 符号开头的类都是自动生成的
目标类
代理类
调用:
字节码重组:
- 拿到被代理对象的引用,并且获取到它的所有的接口,反射获取
- JDK Proxy 类重新生成一个新的类、同时新的类要实现被代理类的所有实现的所有接口
- 动态生成java代码,把新加的业务逻辑方法由一定的逻辑代码去调用(代码中体现)
- 编译生成新的JAVA代码.class;
- 在重新加载到jvm 中运行;