2013-01-25 26 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