ASM - 如何从Java字节码名称转换Java类名?

时间:2011-07-22 12:50:44

标签: java reflection bytecode java-bytecode-asm

我正在使用ASM(字节码修改库),它提供对字节码命名格式的类型名称的访问,例如,报告字符串字段具有描述:Ljava / lang / String

我需要为某些类调用Class.forName,但是我需要类型名称的源代码形式,例如: java.lang.String中。

有没有办法从内部名称转换为Java源格式?

3 个答案:

答案 0 :(得分:7)

我不知道任何API方法,但转换非常简单。你可以在JVM spec here找到详细信息。 原始类型由一个字符表示:

B =字节
C = char
D =双
F =浮动
I = int
J =长
S =短期 Z =布尔

类和接口类型由完全限定名称表示,带有 'L'前缀和';'后缀。圆点'。'在完全限定的类名中 替换为'/'(对于内部类,'。'将外部类名与内部类名分开,将其替换为'$')。所以String类的内部名称是“Ljava / lang / String;”内部类“java.awt.geom.Arc2D.Float”的内部名称为“Ljava / awt / geom / Arc2D $ Float;”。

数组名称以左括号'['开头,后跟组件类型名称(原语或引用)。因此“int []”变为“[I”和“javax.swing.JFrame [] []”变为“[[Ljavax.swing.JFrame;”。

答案 1 :(得分:1)

答案 2 :(得分:0)

使用

org.objectweb.asm.Type.getType(typeDescriptor).getClassName()

示例:对于Ljava/lang/Deprecated;,返回java.lang.Deprecated。 感谢@FlightOfStairs指出正确的班级的提示,找到了这一点。