【问题标题】:Wrapping constructor call in the method to the static call using ASM bytecode manipulation使用 ASM 字节码操作将方法中的构造函数调用包装到静态调用
【发布时间】:2013-02-14 12:29:01
【问题描述】:

我的查询与使用 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

【问题讨论】:

    标签: java-bytecode-asm bytecode-manipulation


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      相关资源
      最近更新 更多