ASM - Как я могу преобразовать имя класса Java из имени байт-кода Java? - PullRequest
6 голосов
/ 22 июля 2011

Я использую ASM (библиотека модификации байт-кода), и она предоставляет доступ к именам типов в формате именования байт-кода, например, сообщается, что поле String имеет описание: Ljava / lang / String

Мне нужно вызвать Class.forName для некоторых классов, но мне нужна форма исходного кода имен типов для этого, например, java.lang.String.

Есть ли способ преобразования внутреннего имени в исходный код Javaформат?

Ответы [ 2 ]

7 голосов
/ 22 июля 2011

Я не знаю ни одного метода API, но преобразование довольно простое. Вы можете найти детали в спецификации JVM здесь . Примитивные типы представлены одним символом:

B = байт
C = символ
D = двойной
F = плавать
Я = 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 голос
/ 15 мая 2012

Вы можете использовать org.objectweb.asm.Type.getInternalName(java.lang.Class).

...