更多 Java 虚拟机方面的文章,请参见文集《Java 虚拟机》
字节码的表现形式为字节数组 byte[] bytes
类/接口 字节码组织形式
类文件 {
0xCAFEBABE,小版本号,大版本号,常量池大小,常量池数组,
访问控制标记,当前类信息,父类信息,实现的接口个数,实现的接口信息数组,域个数,
域信息数组,方法个数,方法信息数组,属性个数,属性信息数组
}
动态编译 Java 源文件
应用:在线 Coding 测评系统,允许用户上传 Java 代码,由系统在后台编译、运行并进行结果判定。
-
JavaCompiler
表示 Java 编译器-
getTask()
生成编译任务CompilationTask
- 调用编译任务
CompilationTask
的call()
执行编译操作
-
-
JavaFileObject
表示 Java 源文件对象,例如SimpleJavaFileObject
-
JavaFileManager
表示 Java 源文件管理器,管理一系列JavaFileObject
示例:
public static void main(String[] args) throws Exception {
String source = "public class Person {\n" +
" private String name;\n" +
" private int age;\n" +
"\n" +
" public Person(String name, int age) {\n" +
" this.name = name;\n" +
" this.age = age;\n" +
" }\n" +
"}";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
JavaCompiler.CompilationTask task = compiler.getTask(null, compiler.getStandardFileManager(null, null, null), null, null, null,
Arrays.asList(
new SimpleJavaFileObject(new URI("Person.java"), JavaFileObject.Kind.SOURCE) {
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return source;
}
}
)
);
task.call();
}
字节码增强
字节码增强:在 Java 字节码生成之后对其修改,增强其功能。
应用:
- Java 注解 Annotation 声明了需要增强的功能及相关的元数据,由框架在运行时动态完成对字节码的增强。
- JPA 实体类
- AOP 面向切片的编程,例如 Spring
字节码增强开源库: