我正在使用ASM(一个字节码修改库),它提供了对字节码命名格式的类型名称的访问,例如,String字段报告具有描述:Ljava/lang/String
我需要调用Class。forName用于某些类,但我需要类型名称的源代码形式,例如java.lang.String.
是否有从内部名称转换到Java源格式的方法?
我不知道任何API方法,但转换非常简单。您可以在这里的JVM规范中找到详细信息。基本类型由一个字符表示:
B = byte
C =
D = double
F = float
I = int
J =
S =
Z = boolean
类和接口类型由完全限定名表示,带有"L"前缀和";"后缀。这些点。'中的完全限定类名是由'/'代替(对于内部类,'。将外部类名与内部类名分开的部分替换为'$')。因此,String类的内部名称将是"Ljava/lang/String;",而内部类的内部名称将是"java.awt. geomm . arc2d"。Float"应该是"Ljava/awt/geom/Arc2D$Float;".
数组名称以左括号"["开头,后跟组件类型名称(原语或引用)。因此,"int[]"变成了"[I]"one_answers"javax.swing"。JFrame[][]"变成了"[[Ljavax.swing.JFrame;"。
您可以使用org.objectweb.asm.Type.getInternalName(java.lang.Class)
。
使用
org.objectweb.asm.Type.getType(typeDescriptor).getClassName()
示例:对于Ljava/lang/Deprecated;
返回java.lang.Deprecated
。发现这要归功于@FlightOfStairs的提示,他指向右边的类。