Java的动态编译、动态加载、字节码操作
2018-02-07 16:17
399 查看
想起来之前做的一个项目:那时候是把需要的源代码通过文件流输出到一个.java文件里,然后调用sun的Comipler接口动态编译成.class文件,然后再用专门写的一个class loader加载这个class到jvm, 这样就可以使用这个动态生成的class里的方法了。 所以大致的过程是:文本化的源代码 -> 编译 -> .class文件 -> 通过流输入到defineClass()接口加载到jvm
这种技术可以用来实现AOP和动态代理等等。
之后在java 6,java把上述sun的Compiler接口纳入到java自己的类库中,提供了统一的动态编译接口方法。而且对于动态代理,java也提供了统一的实现方法,implements InvocationHandler,我们只要去实现InvocationHandler,我们把需要“包装”或“代理”的类告诉java.lang.reflect.Proxy,其会返回给我们一个实现了改类同样接口的代理类,改代理类中的方法会按照我们写的InvocationHandler实现中的样子,对原类的方法进行拦截并加入切面。
而操作字节码,这是更进一步底层和动态的技术,不但可以像上述方法那样动态的去生成一个class,而且还能去修改一个已有的class。
常用的操作字节码的库有:asm, apache BCEL, Javassist等,其中,asm最底层最轻量也最快,但个人感觉javassist最容易上手,也对普通java开发人员最友好 -_-!
这种技术可以用来实现AOP和动态代理等等。
之后在java 6,java把上述sun的Compiler接口纳入到java自己的类库中,提供了统一的动态编译接口方法。而且对于动态代理,java也提供了统一的实现方法,implements InvocationHandler,我们只要去实现InvocationHandler,我们把需要“包装”或“代理”的类告诉java.lang.reflect.Proxy,其会返回给我们一个实现了改类同样接口的代理类,改代理类中的方法会按照我们写的InvocationHandler实现中的样子,对原类的方法进行拦截并加入切面。
而操作字节码,这是更进一步底层和动态的技术,不但可以像上述方法那样动态的去生成一个class,而且还能去修改一个已有的class。
常用的操作字节码的库有:asm, apache BCEL, Javassist等,其中,asm最底层最轻量也最快,但个人感觉javassist最容易上手,也对普通java开发人员最友好 -_-!
相关文章推荐
- Java学习之动态编译--字节码操作--javassist类库
- Java 反射:Class类,动态加载类获取方法和成员变量构造信息,方法反射的基本操作,集合泛型的本质
- Java动态编译源代码并加载执行
- 动态编译 Java 文件 与 动态加载 Java 类
- eclipse下java动态编译时com.sun.tools.javac.Main类加载问题的解决
- 动态生成java、动态编译、动态加载
- 字节码操作_javassist库_动态创建新类_属性_方法_构造器_API详解JAVA216-217
- 动态生成java、动态编译、动态加载
- JAVA下进行动态编译加载的实例
- 整理一下Java动态编译Java代码,并在加载到内存中然后执行类中方法的api的介绍
- java 动态编译.java文件,然后动态加载运行
- java编程进行动态编译加载代码分享
- java动态编译动态加载方法
- Java类动态加载(一)——java源文件动态编译为class文件
- java动态编程-操作字节码
- 动态编译 Java 文件 与 动态加载 Java 类
- Java动态编译和类的重新加载
- 从String中动态(内存中)编译和加载java类
- JAVA1.6实现动态编译加载运行
- 动态编译、运行JAVA程序