最近需要使用javassist动态改变类里的方法,问题是javassist使用过一次以后,第二次使用就会冻结,可是在第二次就算用了解冻,调用toclass以后还是会报异常,主要是为了得到frmAttributesI的实体,怎样已经冻结的class解冻之后还可以继续编辑修改并调用呢?
String body = null;
CtClass cc = null;
IFrmAttributes frmAttributesI = null;
//从数据查找判断是否是二次加载
String isCondUpdate = "Y";
if(isClassInit == false){
//第一次调用
// 获取所有条件信息(执行脚本)
ClassPool pool = ClassPool.getDefault();
//导入相关jar包
pool.importPackage("java.util.Hashtable");
pool.importPackage("java.util.List");
pool.importPackage("java.util.Date");
pool.importPackage("java.text.SimpleDateFormat");
// 在外部变量执行类中,动态加载外部变量执行算法
cc = pool.get("com.process.FrmAttributes");
CtMethod cm = cc.getDeclaredMethod("process");
//cc.defrost();
System.out.println("测试1=================="+body.toString());
cm.setBody("{" + body.toString() + "}");
Class c = cc.toClass();
frmAttributesI = (FrmAttributes) c.newInstance();
this.isClassInit = true;
}else{
if(isCondUpdate == "Y"){
frmAttributesI = null;
ClassPool pool2 = ClassPool.getDefault();
cc = pool2.get("com.process.FrmAttributes");
if(cc.isFrozen()){
cc.defrost();
}
//删除方法,增加方法,试试二次加载
//第二次调用
CtMethod cm2 = cc.getDeclaredMethod("process");
System.out.println("测试2============================"+body.toString());
cm2.setBody("{" + body.toString() + "}");
cc.writeFile();
Class c = cc.toClass();
frmAttributesI = (FrmAttributes) c.newInstance();
}
}