0

私のクエリは、ASM を使用したバイトコード操作に関連しています。

次のような方法があります -

/*Original method code*/  
String str ="abs";    
// create object of SampleClass2 // constructor calling   
SampleClass2 sample = new SampleClass2();   
// call instance method         
sample.PrintMe(str); 

上記のメソッドでは、SampleClass2() コンストラクターを、ロジックを実行した後に同じ SampleClass2 オブジェクトを返す 1 つの静的メソッド呼び出しに変更したいと考えています。その後、私のメソッドは次のようになります。

/*
 * After bytecode manipulation*
*/
String str ="abs";  
// get a  constructor using  static call   
SampleClass2 sample = StaticClass.getSampleClass2Object(); 
sample.PrintMe(str);

ASM バイトコード操作を使用してこれを達成する方法を教えてください。同じように既存のバイトコードスタックを変更する必要がありますか?DUP

4

1 に答える 1

0

主な問題は、オブジェクトが最初に「new」命令で作成され、次にコンストラクターが呼び出されることです。「new」呼び出しとコンストラクター呼び出しの両方を置き換える必要がありますが、これは実現が難しい場合があります。その道を進みたい場合は、ASMドキュメントの第8章(ツリーAPI->メソッド分析)p115を確認してください。

ただし、それで十分な場合は、静的メソッドの呼び出しを追加して、インスタンス化後のロジックを実行できます。これは非常に簡単です。コンストラクター呼び出しを見つけて、後で静的呼び出しをメソッドに追加します。このメソッドは、パラメーターとしてSampleClass2を受け取り、SampleClass2(おそらく同じインスタンス)を返します。

于 2013-02-15T06:38:22.590 に答える