2017-07-21 607 views
0

我想从源自另一个项目的jar中的类的方法体开始插入代码片段。 在这个当前的项目中,我使用的是javassist库,使用它我能够找到并操作我想要修改的类和方法,因为我已经将此旧项目的jar添加为当前库中的库。下面是代码,我可以这样做:如何在使用Javassist的ChMethod中使用insertBefore()加载修改?

try { 
    ClassPool classPool = ClassPool.getDefault(); 
    CtClass vendaControllerCt = classPool.getCtClass("com.t2tierp.pafecf.controller.VendaController"); 
    CtMethod[] methods = vendaControllerCt.getMethods(); 
    for(CtMethod method : methods){ 
     if(method.getName().equals("insereVendaCabecalhoTrocaDevolucao")){ 
      method.insertBefore("{pVendaCabecalho.setCupomSat(java.lang.Boolean.FALSE);"); 
     } 
    } 
} catch (NotFoundException e) { 
    e.printStackTrace(); 
} catch (CannotCompileException e) { 
    e.printStackTrace(); 
} 

在本节中,当我发现我要修改的方法,我插入新行名为insereVendaCabecalhoTrocaDevolucao使用库方法insertBefore()被ajusted 。但是当我执行该项目并调用我修改的方法时,调整不会被加载,并且原始方法将在未经过我调整的情况下加载。

使用InstructionPrint.print(),我可以验证显然正在进行更改,但在调用方法时未加载。

执行该方法时我的修改被调用时缺少什么?

谢谢。

回答

0

您需要在CtClass对象上调用writeFile以将更改保存到文件中。

0

我解决了设置字节码类与更改的问题。 下面是代码,其中用该溶液:

if(method.getName().equals("insereVendaCabecalhoTrocaDevolucao")){ 
    method.insertBefore("{pVendaCabecalho.setCupomSat(java.lang.Boolean.FALSE);}"); 
    byteCode = vendaControllerCt.toBytecode(); 
} 

感谢。