我们都知道一个.java的文件是没有办法直接运行的。 真正运行在JVM上的是.java文件编译后的class文件。
总而言之我们只要可以得到符合JVM规范的class文件就可以了。 那么我们就来思考一下到底可以用哪些方式来组成class文件
编写java代码。运行javac命令 生成class文件。 这种方式:很明显我们通常情况下都是使用的这种方法。就不多说了
CA FE BA BE 00 00 00 34 ...... 如果您精通class文件格式,喜欢16进制的这种格式,且时间充裕,请选择这种方式。。。
上大学那会很好奇菜鸟教程是怎么做到直接编译用户输入的字段字符串的。当时问了好几个老师,能不能把程序中一段代码字符串直接编译。无果,直到了解到JavaCompiler
JavaCompiler 是JDK1.6提供的一套运行时编译API 可以在项目运行是,将一段java代码字符串编译成class格式的的byte数组,
在一些特殊的情况下,可以先写一些模板文件。在运行时替换掉一些参数,再编译,也是一个不错的选择。
JDK 和CGLIB,Javassist,ASM
ASM是一个 Java 字节码操控框架。它能够以二进制形式修改已有类或者动态生成类。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。 不过ASM在创建class字节码的过程中,操纵的级别是底层JVM的汇编指令级别,这要求ASM使用者要对class组织结构和JVM汇编指令有一定的了解。
javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。
它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。
直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。