2017-07-21 2 views
0

私は、別のプロジェクトのjarを起源とするクラスのメソッド本体の先頭にコードフラグメントを挿入しようとしています。 私はこの古いプロジェクトのjarファイルをこの現在のライブラリに追加していますので、この現在のプロジェクトでは、javaistライブラリを使用しています。このクラスを使用して、修正したいクラスとメソッドを見つけて操作できます。 。ここで私はこれを行うことができますコードは次のようになります。このセクションでは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という名前の私が変更したい方法を、見つけて、私は、ライブラリのメソッドを使用してajustedされる新しい行を挿入insertBefore() 。しかし、私がプロジェクトを実行しているときに、私が変更したメソッドを呼び出すと、調整がロードされず、元のメソッドが調整されずにロードされます。

InstructionPrint.print(),を使用すると、明らかに変更が行われていることが確認できましたが、メソッドを呼び出すとロードされませんでした。

メソッドの実行時に変更を呼び出すために欠けているものはありますか?

ありがとうございました。

答えて

0

CtClassオブジェクトでwriteFileに電話して、変更をファイルに保存する必要があります。

0

私は、バイトコードクラスを変更して問題を解決しました。

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

ありがとう:ここ は、溶液を用いてコードです。

関連する問題