如何在内部 类 上使用 ASMifier?

How do I use ASMifier on inner classes?

我正在尝试在 java 中获取内部 class 的 ASMified 版本。我的命令看起来像这样 java -classpath "asm-all-3.3.1.jar:myjar.jar" org.objectweb.asm.util.ASMifierClassVisitor path/to/my/class$inner.class 但它似乎只是 return 外部 class 的 ASMified 版本,我在这里做错了什么?

如何使用比 2008 年更新的 ASM 版本,也许还可以处理比 Java 6 更新的 类?我建议这些:

我很快尝试了这样的事情(Git Bash 在 Windows 10):

java -cp "asm-9.2.jar;asm-util-9.2.jar" org.objectweb.asm.util.ASMifier MyClass$MyInnerClass.class

在 Cmd.exe 中将是:

java -cp asm-9.2.jar;asm-util-9.2.jar org.objectweb.asm.util.ASMifier MyClass$MyInnerClass.class

两种变体都能很好地工作。

当你尝试时,你就会遇到问题

echo path/to/my/outer$inner.class

这将打印

path/to/my/outer.class

您的 shell 将 $inner 解释为变量引用,并且由于您的环境中可能没有定义此类变量,因此它将用空文本替换它,在这种情况下会导致外部路径和名称 class.

这证明了为什么默默地做错事比失败并显示错误消息(或异常)更糟糕。

当您在美元符号前加上反斜杠时,即 path/to/my/outer$inner.class,它将被解释为文字 $ 并起作用。或导致其他错误,如其他答案所述,您的 ASM 版本确实很旧,并且可能无法解析较新的 class 文件。