2011-09-08 69 views
0

我正在使用ASM Java庫從頭開始生成類X。在這個類的靜態方法之一中,我需要推送一個對X.class的引用。由於還沒有X.class我不能使用visitLdcInsn。有沒有辦法做到這一點?推動堆棧參考開始使用ASM生成的類

嗯,這是可能的(我目前正在使用它)生成以下代碼(new X().getClass()),但我敢肯定,這不是最乾淨的方式來做到這一點。

回答

0

使用生成的代碼,您通常不需要將類推入堆棧。通過方法調用您可以做的任何事情通常都可以在字節碼中找到。假設你必須調用一個帶有類的方法,你可以將它推到堆棧上,無論它是否存在。

我使用的東西是ASMifier。這很有用,因爲你可以從一個類開始,它編譯並做你想做的模板,並讓它轉儲重建類所需的所有代碼。這意味着你並不需要自己編寫大部分代碼。

public class Main { 
    public static void main(String... args) throws IOException { 
    ASMifierClassVisitor cv = new ASMifierClassVisitor(new PrintWriter(System.out)); 
    ClassReader cr = new ClassReader("X"); 
    cr.accept(cv, 0); 
    } 
} 

class X { 
    { 
    System.out.println("Inside class "+X.class); 
    } 
} 

打印

// lots of code 
mv.visitLdcInsn(Type.getType("LX;")); 
// more code. 
+0

的問題是:這個靜態方法我生成我需要調用使用「X.class」作爲它的一個參數的另一種方法,所以我需要裏面推X.class放入堆棧 – ASMQuestion

+0

我已經添加了一個示例。除非你的意思是你想要使用'X'的靜態方法 –

+0

我很抱歉,在你完成之前我正在閱讀。我想Type.getType(「LX;」)正是我所需要的。我會看看ASMifier,我想這可以簡化很多東西。謝謝! – ASMQuestion