0
我正在使用ASM Java庫從頭開始生成類X
。在這個類的靜態方法之一中,我需要推送一個對X.class
的引用。由於還沒有X.class
我不能使用visitLdcInsn
。有沒有辦法做到這一點?推動堆棧參考開始使用ASM生成的類
嗯,這是可能的(我目前正在使用它)生成以下代碼(new X().getClass())
,但我敢肯定,這不是最乾淨的方式來做到這一點。
我正在使用ASM Java庫從頭開始生成類X
。在這個類的靜態方法之一中,我需要推送一個對X.class
的引用。由於還沒有X.class
我不能使用visitLdcInsn
。有沒有辦法做到這一點?推動堆棧參考開始使用ASM生成的類
嗯,這是可能的(我目前正在使用它)生成以下代碼(new X().getClass())
,但我敢肯定,這不是最乾淨的方式來做到這一點。
使用生成的代碼,您通常不需要將類推入堆棧。通過方法調用您可以做的任何事情通常都可以在字節碼中找到。假設你必須調用一個帶有類的方法,你可以將它推到堆棧上,無論它是否存在。
我使用的東西是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.
的問題是:這個靜態方法我生成我需要調用使用「X.class」作爲它的一個參數的另一種方法,所以我需要裏面推X.class放入堆棧 – ASMQuestion
我已經添加了一個示例。除非你的意思是你想要使用'X'的靜態方法 –
我很抱歉,在你完成之前我正在閱讀。我想Type.getType(「LX;」)正是我所需要的。我會看看ASMifier,我想這可以簡化很多東西。謝謝! – ASMQuestion