??可以利用开源库直接操作字节码,如CGLib、ASM、Javassist等,他们可以在程序运行时,动态地创建字节码类或者编辑存在的字节码类。其中,CGLib是基于ASM实现的,是一个高效高性能的生成库;而ASM是一个轻量级的类库,但需要涉及到JVM的操作和指令;相比而言,Javassist要简单的多,完全是基于Java的API,但其性能相比前二者要差一些。
??Java 编译完后不会立即生成代理类,而是在运行时动态生成代理类字节码,并加载到内存中。通过实现JDK的接口 InvocationHandler 就可以来实现动态代理。
??使用JDK实现动态代理的类必须要实现一个接口,在实际开发中有一定的局限性,反射的效率也并不是很高,因此可以利用操作字节码技术来实现动态代理。流行的开发框架 Spring 则同时实现了这两种方式,可以在实际开发中选择基于JDK的动态代理,或者基于CGLib的动态代理。
CGLib 的 github地址
通过CGLib来实现动态代理需要引入CGLib和asm的依赖包
需要被代理的类
实现CGLib的方法拦截器
测试类
运行结果
F 盘下生成的代理类
由于CGlib是通过对需要增强的类生成一个子类,并覆盖其中的方法来实现动态代理的,所以CGlib可以为无接口的类直接做代理,但是不能为final类做代理。