【JAVA SE基础篇】68.动态编译,脚本引擎,字节码操作
1.动态编译
1.介绍
jdk1.6后引入动态编译机制
应用场景:
可以做一个浏览器端编写java代码,上传服务器编译和运行的在线评测系统
服务器动态加载某些类文件进行编译
两种方法:
通过Runtime调用编译器,启动显得进程去操作
通过JavaCompiler动态编译
通过反射运行编译好的类
2.通过JavaCompiler动态编译
第一个null:为编译器提供参数
第二个null:得到java编译器的输出信息
第三个null:接受编译器的错误信息
sourceFile:可变参数(String数组)能传入一个或多个java源文件的地址
返回值:0代表编程成功,非0则编译失败
3.通过反射运行编译好的类
2.通过脚本引擎执行js代码
3.字节码操作
java动态性的两种常见实现方式:字节码操作和反射
运行时操作字节码可以实现:动态生成新的类,动态改变某个类的结构(添加/删除/修改 新的属性/方法)
优势:比反射开销小,性能高
常见的字节码操作类库:1.BCEL,2.ASM,3.CGLIB,4.JAVASSIT
javassist的最外层的api和java反射包中的api相似
主要由CtClass,CtMethod,以及CtField几个类组成。
用于执行和jdk反射api中java.lang,Class,java.lang,Method,java.lang,reflect.Method.Field相同的操作
1.使用ssist库创建一个全新的类
2.使用XJAD反编译工具,将生成的class文件反编译成JAVA文件
4.javassist常见api
5.javassist的局限性
jdk5的新语法不支持(包括泛型、枚举),不支持注解修改,但可以通过底层javassist类来解决
不支持数组的而初始化,除非数组的容量为1
不支持内部类和匿名类
不支持continue和break表达式
对于继承关系有些不支持
例:
class A{}
class B extends A{}
class C extends B{}