动态代理与动态编译
2019-10-25 06:45:01来源:博客园 阅读 ()
动态代理与动态编译
动态编程
动态编程是相对于静态编程而言,平时我们大多讨论的都是静态编程,java便是一种静态编程语言,它 的类型检查是在编译期间完成的。而动态编程是绕过了编译期间,在运行时完成类型检查。java有如下方法实现动态编程:动态代理,动态编译
动态代理:
动态代理在我在设计模式中已经介绍过了,主要是通过 Proxy类的newProxyInstance方法和接口InvocationHandler来实现动态代理。代理对象的的生产过程在这里简单说一下:
1、ProxyGenerator.generateProxyClass方法负责生成代理类的字节码,生成逻辑比较复杂,了解原理继续分析源码 sun.misc.ProxyGenerator;
byte[] proxyClassFile = ProxyGenerator.generateProxyClass(proxyName, interfaces, accessFlags);
2、native方法Proxy.defineClass0负责字节码加载的实现,并返回对应的Class对象。
Class clazz = defineClass0(loader, proxyName, proxyClassFile, 0, proxyClassFile.length);
3、利用clazz.newInstance反射机制生成代理类的对象;
动态代理的局限性:它必须要求委托类实现一个接口,但是并非所有的类都有接口,对于没有实现接口的类,无法使用该方法实现代理;而且该方法无法 对委托类的方法内部逻辑作修改。
动态编译:
动态编译就是利用字节码修改技术,来操作java字节码在运行期间jvm中动态生成新类或者对已有类进行修改。动态编译时在java 6开始支持的,主要是通过一个JavaCompiler接口来完成的。可以解决需要动态插入代码的场景,比如动态代理的实现,实现AOP编程。
操作java字节码的工具有两个比较流行,一个是ASM,一个是Javassit 。
ASM :直接操作字节码指令,执行效率高,要是使用者掌握Java类字节码文件格式及指令,对使用者的要求比较高。
Javassit 提供了更高级的API,执行效率相对较差,但无需掌握字节码指令的知识,对使用者要求较低。
应用层面来讲一般使用建议优先选择Javassit,如果后续发现Javassit 成为了整个应用的效率瓶颈的话可以再考虑ASM.当然如果开发的是一个基础类库,或者基础平台,还是直接使用ASM吧,相信从事这方面工作的开发者能力应该比较高。
javassit使用:
Java 字节码以二进制的形式存储在 .class 文件中,每一个 .class 文件包含一个 Java 类或接口。Javaassist 就是一个用来 处理 Java 字节码的类库。它可以在一个已经编译好的类中添加新的方法,或者是修改已有的方法,并且不需要对字节码方面有深入的了解。同时也可以去生成一个新的类对象,通过完全手动的方式。
首先需要引入jar包:
<dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.25.0-GA</version> </dependency>
Javassist中最为重要的是ClassPool,CtClass ,CtMethod 以及 CtField这几个类。
ClassPool:一个基于HashMap实现的CtClass对象容器,其中键是类名称,值是表示该类的CtClass对象。默认的ClassPool使用与底层JVM相同的类路径,因此在某些情况下,可能需要向ClassPool添加类路径或类字节。
CtClass:表示一个类,这些CtClass对象可以从ClassPool获得。
CtMethods:表示类中的方法。
CtFields :表示类中的字段。
待续
原文链接:https://www.cnblogs.com/perserv/p/11714858.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 代理项 Surrogate 2020-06-11
- Spring Boot 2.3.0 新特性Redis 拓扑动态感应 2020-06-11
- SpringBoot通过web页面动态控制定时任务的启动、停止、创建 2020-06-09
- Spring Cloud Gateway 扩展支持动态限流 2020-06-08
- CGLIB动态代理机制,各个方面都有写到 2020-06-04
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash