1

我需要使我的代码适应更严格的 Java 7 验证程序,并且必须visitFrame在我的 MethodNode 中添加调用(我正在使用树 API)。我找不到有关如何Type映射到Object[]visitFrame 中使用的 s 的任何信息,所以请在这里帮助我...

这是我到目前为止所拥有的:

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.VOID和是什么Type.METHOD?我什么时候需要Opcodes.TOPOpcodes.NULLOpcodes.UNINITIALIZED_THIS

我猜UNINITIALIZED_THIS它只在构造函数中使用,我可能会忽略VOIDand METHOD,但我不确定,我一点也不知道是什么TOP

4

1 回答 1

0

如果我正确理解您的需求,您可以让 ASM 为您计算帧数。这可能会稍微减慢类的生成速度,但肯定值得一试。

创建时ClassWriter,只需添加COMPUTE_FRAMES到构造函数的标志参数,例如

new ClassWriter(ClassWriter.COMPUTE_FRAMES);

同样,如果您正在转换一个类,ClassReader可以要求扩展框架,例如:

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

前一个选项的好处是您可以完全忘记帧(和“最大值”),而后一个选项可能需要您自己修补帧,具体取决于您执行的转换类型。

这些示例适用于 ASM 版本 4,但至少从版本 3 开始支持这些功能 - 参数的传递方式略有不同。

于 2013-02-22T20:12:09.023 回答