Java 字节码操作

更多 Java 虚拟机方面的文章,请参见文集《Java 虚拟机》


字节码的表现形式为字节数组 byte[] bytes

类/接口 字节码组织形式

类文件 {
   0xCAFEBABE,小版本号,大版本号,常量池大小,常量池数组,
   访问控制标记,当前类信息,父类信息,实现的接口个数,实现的接口信息数组,域个数,
   域信息数组,方法个数,方法信息数组,属性个数,属性信息数组
}

动态编译 Java 源文件

应用:在线 Coding 测评系统,允许用户上传 Java 代码,由系统在后台编译、运行并进行结果判定。

  • JavaCompiler 表示 Java 编译器
    • getTask() 生成编译任务 CompilationTask
    • 调用编译任务 CompilationTaskcall() 执行编译操作
  • 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

字节码增强开源库:

  • cglib
  • ASM
  • SERP
  • BCEL

引用:
Java深度历险(一)——Java字节代码的操纵

你可能感兴趣的:(Java 字节码操作)