2 zc331560430 zc331560430 于 2013.11.05 10:01 提问

关于javassist重复加载的问题

最近需要使用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();
            }
        }
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!