62,614
社区成员
发帖
与我相关
我的任务
分享
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.Loader;
import javassist.NotFoundException;
import javassist.Translator;
/**
* 实现javassist.Translator接口
* @author Administrator
*
*/
public class AopTest implements Translator{
/**
* 以AopTest类的main作为入口方法
* @param args
* @throws NotFoundException
*/
/**
* @param args
*/
public static void main(String[] args){
try {
AopTest aopTest = null;
ClassPool classPool = ClassPool.getDefault();
Loader loader = new Loader();
loader.addTranslator(classPool, aopTest = new AopTest());
loader.run("A", args);//调用真正的入口,这里以A.main方法为入口
} catch (Throwable tr) {
// TODO Auto-generated catch block
tr.printStackTrace();
}
}
@Override
public void onLoad(ClassPool classPool, String className) throws NotFoundException,
CannotCompileException {
// TODO Auto-generated method stub
if(!"A".equals(className)){
return;
}
CtClass ctClass = classPool.get(className);
//在A类中织入一个int型的Field,名称为Field
CtField ctField = new CtField(CtClass.intType, "Field1",ctClass);
//给A的这个新增Field赋一个初值123
ctClass.addField(ctField, "123");
}
@Override
public void start(ClassPool arg0) throws NotFoundException,
CannotCompileException {
// TODO Auto-generated method stub
}
}
/**
* 在类加载时被修改的测试类
* @author Administrator
*
*/
public class A {
/**
* 注意,A中并没有定义任何Field
* @throws Exception
*/
public A() throws Exception{
for(java.lang.reflect.Field f : A.class.getDeclaredFields()){
System.out.println(f.getName()+":"+f.get(this));
}
}
public static void main(String[] args) throws Exception {
A a = new A();
}
}
打印结果
Field1:123
希望这个例子能帮助你