6

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

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

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

4

3 回答 3

8

我不知道任何API方法,但转换很简单。您可以在此处找到JVM 规范中的详细信息。原始类型由一个字符表示:

B = 字节
C = 字符
D = 双
F = 浮点
I = 整数
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;”。

于 2011-07-22T13:22:38.853 回答
1

您可以使用org.objectweb.asm.Type.getInternalName(java.lang.Class).

于 2012-05-15T02:05:08.140 回答
1

采用

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

示例:对于Ljava/lang/Deprecated;退货java.lang.Deprecated。感谢@FlightOfStairs 的提示,他指出了正确的班级。

于 2020-10-21T10:53:08.090 回答