4、客户端
public class Client { public static void main(String[] args) { Internet internet = new ProxyInternet(new RealInternet()); try { internet.connectTo("360.cn"); internet.connectTo("qq.com"); } catch (Exception e) { System.out.println(e.getMessage()); } }}
动态代理的方式中 , 所有的函数调用最终都会经过 invoke 函数的转发 , 因此我们就可以在这里做一些自己想做的操作 , 比如日志系统、事务、拦截器、权限控制等 。
cglib代理静态代理和 JDK 代理模式都要求目标对象实现一个接口 , 但有时候目标对象只是一个单独的对象 , 并没有实现任何接口 , 这个时候就可以使用目标对象子类来实现代理 , 这就是 cglib 代理 。
- cglib(Code Generation Library)是一个基于ASM的字节码生成库 , 它允许我们在运行时对字节码进行修改和动态生成 。cglib 通过继承方式实现代理 。它广泛的被许多AOP的框架使用 , 比如我们的 Spring AOP 。
- cglib 包的底层是通过使用字节码处理框架 ASM 来转换字节码并生成新的类 。
- cglib 代理也被叫做子类代理 , 它是在内存中构建一个子类对象从而实现目标对象功能扩展 。
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.3.0</version></dependency>
1、不需要接口public class RealInternet{ public void connectTo(String serverHost) { System.out.println("Connecting to "+ serverHost); }}
2、代理工厂类public class ProxyFactory implements MethodInterceptor { private Object target; public ProxyFactory(Object target){ this.target = target; } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("cglib 代理开始 , 可以添加逻辑"); Object obj = method.invoke(target,objects); System.out.println("cglib 代理结束"); return obj; } public Object getProxyInstance(){ //工具类 , 类似于JDK动态代理的Proxy类 Enhancer enhancer = new Enhancer(); //设置父类 enhancer.setSuperclass(target.getClass()); //设置回调函数 enhancer.setCallback(this); //创建子类对象 , 即代理对象 return enhancer.create(); }}
3、客户端public class Client { public static void main(String[] args) { //目标对象 RealInternet target = new RealInternet(); //获取代理对象,并且将目标对象传递给代理对象 RealInternet internet = (RealInternet) new ProxyFactory(target).getProxyInstance(); internet.connectTo("so.cn"); }}
4、输出cglib 代理开始 , 可以添加逻辑Connecting to so.cncglib 代理结束
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 如何在面试中解释各种机器学习模型
- 求职|思维策略:一项目完胜大多数所谓面试神技的策略(上)
- Spring Boot 上传图片完整示例
- SpringBoot中获取微信用户信息从未如此简单
- Spring Boot配置文件yml格式详解
- 超全、超详的Spring Boot配置讲解笔记
- 面试|我月薪5千,面试如何谈到1万?
- Java包装类与基本类型区别与应用,解析面试题
- 面试官:先来简单聊一下SQL Join,看你对数据了解的怎么样
- 谷歌面试问题50%需要用递归:理解递归算法的本质这篇够不够?