【JAVA SE基础篇】68.动态编译,脚本引擎,字节码操作

1.动态编译

1.介绍

jdk1.6后引入动态编译机制

应用场景:

  可以做一个浏览器端编写java代码,上传服务器编译和运行的在线评测系统

  服务器动态加载某些类文件进行编译

两种方法:

  通过Runtime调用编译器,启动显得进程去操作

  通过JavaCompiler动态编译

  通过反射运行编译好的类

2.通过JavaCompiler动态编译

第一个null:为编译器提供参数

第二个null:得到java编译器的输出信息

第三个null:接受编译器的错误信息

sourceFile:可变参数(String数组)能传入一个或多个java源文件的地址

返回值:0代表编程成功,非0则编译失败

3.通过反射运行编译好的类

2.通过脚本引擎执行js代码

JAVA脚本引擎是从JDK6.0之后添加的新功能。
脚本引擎介绍:
– 使得 Java 应用程序可以通过一套固定的接口与各种脚本引擎交互,从
而达到在 Java 平台上调用各种脚本语言的目的。
– Java 脚本 API 是连通 Java 平台和脚本语言的桥梁。
– 可以把一些复杂异变的业务逻辑交给脚本语言处理,这又大大提高了
开发效率。

 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{}

原文地址:https://www.cnblogs.com/chengkuan/p/13427903.html