在jdk5.0版本中,添加了一个新的接口java.lang.instrument.Instrumentation,这个接口可以用来在类加载的时候对类的字节码进行修改,改变类的功能的实现。通过这种方法,我们就可以实现aop的功能,这是和proxy动态代理的不同的另一种aop的实现。
这种方法的原理很简单,就是通过修改编译器已经编译好的字节码来修改类,和我们通常修改类源码来实现对类的修改差不多。只不过是在两个不同的层次进行的修改。
一下是使用这个接口的具体方法。
第一步:
需要实现 java.lang.instrument.Instrumentation这个接口,通过在这个接口的实现类中,在加载类的时候修改类的字节码。以下是接口的实现 Transformer.java
public class Transformer implements ClassFileTransformer {
//在程序运行之前就被jvm调用的方法
public static void premain(String args, Instrumentation inst) {
inst.addTransformer(new Transformer());
}
public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
byte[] classfileBuffer) throws IllegalClassFormatException {
byte[] result =null; //定义新的字节码存储变量
//在此通过修改类的字节码 classfileBuffer,来更改类。
return result; //返回新的字节码
}
}
这种方法的原理很简单,就是通过修改编译器已经编译好的字节码来修改类,和我们通常修改类源码来实现对类的修改差不多。只不过是在两个不同的层次进行的修改。
一下是使用这个接口的具体方法。
第一步:
需要实现 java.lang.instrument.Instrumentation这个接口,通过在这个接口的实现类中,在加载类的时候修改类的字节码。以下是接口的实现 Transformer.java
public class Transformer implements ClassFileTransformer {
//在程序运行之前就被jvm调用的方法
public static void premain(String args, Instrumentation inst) {
inst.addTransformer(new Transformer());
}
public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
byte[] classfileBuffer) throws IllegalClassFormatException {
byte[] result =null; //定义新的字节码存储变量
//在此通过修改类的字节码 classfileBuffer,来更改类。
return result; //返回新的字节码
}
}