使用ASM字节码操作将构造函数调用方法调用静态调用

时间:2013-02-14 12:29:02

标签: java-bytecode-asm bytecode-manipulation

我的查询与使用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对象。所以在那之后我的方法看起来就像这样。

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

请告诉我如何使用ASM字节码操作实现此目的。我们是否需要更改现有的字节码堆栈,例如DUP

1 个答案:

答案 0 :(得分:0)

主要问题是首先使用" new"创建对象。指令,然后调用构造函数。您必须更换" new"和构造函数调用,这可能很难实现。如果您想沿着这条路前进,请务必查看ASM文档中的第8章(树API - >方法分析)第115页。

但是,如果确实如此,您可以简单地添加对静态方法的调用来执行一些后实例化逻辑,这非常简单。只需找到构造函数调用,然后向方法添加静态调用,该方法将SampleClass2作为参数并返回SampleClass2(可能是同一个实例)