2013-01-25 25 views
1

我需要將我的代碼調整爲更嚴格的Java 7驗證程序,並且必須在我的MethodNode(我正在使用樹API)中添加visitFrame調用。我無法找到如何Type映射到visitFrame使用的Object[]小號的任何信息,所以請幫我在這裏...什麼是從Type.getSort()到visitFrame(...)中的本地和堆棧數組的映射?

這是我到目前爲止有:

private Object getFrameType(Type type) { 
    switch (type.getSort()) { 
     case Type.BOOLEAN: 
     case Type.CHAR: 
     case Type.BYTE: 
     case Type.SHORT: 
     case Type.INT: 
      return Opcodes.INTEGER; 
     case Type.LONG: 
      return Opcodes.LONG; 
     case Type.FLOAT: 
      return Opcodes.FLOAT; 
     case Type.DOUBLE: 
      return Opcodes.DOUBLE; 
     case Type.OBJECT: 
     case Type.ARRAY: 
      return type.getInternalName(); 
    } 
    throw new RuntimeException(type + " can not be converted to frame type"); 
} 

我會想知道的是:Type.VOIDType.METHOD是什麼? 我何時需要Opcodes.TOPOpcodes.NULLOpcodes.UNINITIALIZED_THIS

我猜UNINITIALIZED_THIS僅在構造函數中使用,我大概可以忽略VOIDMETHOD,但我不知道,我沒有絲毫的想法是什麼TOP是。

+0

我正在尋找這樣的方法,謝謝:-),你有沒有修改它? –

回答

0

如果我正確理解您的需求,您可以讓ASM爲您計算框架。這可能會減慢班級的生成,但肯定值得一試。

創建ClassWriter時,只需將COMPUTE_FRAMES添加到構造函數的flags參數中,例如,

new ClassWriter(ClassWriter.COMPUTE_FRAMES); 

同樣,如果您要變換班,ClassReader可以要求expand the frames,如:

ClassReader cr = ...; 
ClassNode cn = new ClassNode(ASM4); 
cr.accept(cn, ClassReader.EXPAND_FRAMES); 

前者選項,你可以對幀忘記的利益(和「MAXS」 ),而後一種選擇可能需要您自己修補幀,具體取決於您所做的轉換類型。

這些示例適用於ASM版本4,但至少從版本3開始支持這些功能 - 參數傳遞有點不同。

+1

嗨,我不能在我的程序中使用COMPUTE_FRAMES,因爲它加載了我想要導致LinkerErrors的儀器的類。我仍然會選擇這個作爲答案,因爲我不再有這個問題。 – Arne