7

I'm using ASM (a bytecode modification library) and it provides access to type names in the bytecode naming format, for example a String field is reported to have the description: Ljava/lang/String

I need to invoke Class.forName for some classes, but I need the source code form of the type names for that, e.g. java.lang.String.

Is there a way of converting from internal name to Java source format?

3 Answers 3

8

I don't know any API method, but the conversion is quite simple. You cand find details in JVM spec here. Primitive types are represented by one character:

B = byte
C = char
D = double
F = float
I = int
J = long
S = short
Z = boolean

Class and interface types are represented by the fully qualified name, with an 'L' prefix and a ';' suffix. The dots '.' in the fully qualified class name are replaced by '/' (for inner classes, the '.' separating the outer class name from the inner class name is replaced by a '$'). So the internal name of the String class would be "Ljava/lang/String;" and the internal name of the inner class "java.awt.geom.Arc2D.Float" would be "Ljava/awt/geom/Arc2D$Float;".

Array names begin with an opening bracket '[' followed by the component type name (primitive or reference). An "int[]" thus becomes "[I" and a "javax.swing.JFrame[][]" becomes "[[Ljavax.swing.JFrame;".

Sign up to request clarification or add additional context in comments.

2 Comments

With the caveat that you cannot actually instantiate an inner class dynamically using its FQN. You need to use the same name as would be returned by Class.getName() instead - in this case java.awt.geom.Arc2D$Float.
Thanks, I was hoping for some api, but I'll do it manually in this case.
1

You can use org.objectweb.asm.Type.getInternalName(java.lang.Class).

3 Comments

This is wrong in 2 ways. 1) The OP wants to convert from the internal form to the source code form. This method goes the other way. 2) The OP wants to convert a String so that he can pass it as an argument to Class.forName(). Obviously, he doesn't have the Class object at this point.
A correct way would be Type.getObject(className).getClassName().
FlightOfStairs, why don't you add it as an answer?
1

Use

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

Example: for Ljava/lang/Deprecated; returns java.lang.Deprecated. Found this thanks to hint from @FlightOfStairs who pointed at right class.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.