Получение подписи типа Java в виде строки
Мне нужно получить (в виде строки) сигнатуры типов определенных типов Java.
Например, это сигнатура типа определенного ParameterizedType:
Lorg/mapackage/MyClass<Ljava/lang/String;>;
Мне это нужно в контексте приложения, разрабатываемого с помощью Javassist.
Чтобы лучше объяснить, что я ищу, приведу выдержку из метода createGetter
который использует Javassist для генерации метода получения для частного поля. Тип поля является параметризованным типом (т. Е. Он использует дженерики).
createGetter
Метод получает в качестве первого параметра тип поля, второй параметр - имя поля, а третий - класс, в который следует добавить метод:
public CtMethod createGetter(Type propertyType, String propertyName, CtClass ctDeclaringClass) {
CtMethod ctGetterMethod = ...
if(propertyType instanceof ParameterizedType //parameterized "single" type
|| propertyType instanceof GenericArrayType) { //parameterized array
String signature = asGenericSignature(propertyType); //MISSING PIECE OF THE PUZZLE !
ctGetterMethod.setGenericSignature(signature);
}
return ctGetterMethod;
}
Например, если у меня есть класс
public class TestClass{
private MyClass<String> myField;
}
Затем после вызова createGetter
метод для поля myField
, класс становится:
public class TestClass{
private MyClass<String> myField;
public MyClass<String> getMyField() {
return MyClass<String> myField;
}
}
Тип возвращаемого значения сгенерированного метода getter должен иметь ту же общую сигнатуру, что и поле (код может компилироваться без использования метода, имеющего ту же общую сигнатуру поля, поскольку для компилятора достаточно одного и того же класса. Причины, по которым он мне нужен иметь общую подпись одного типа здесь не объясняется).
Код createGetter
Метод показывает, что в Javassist для установки сигнатуры обобщенного типа метода мне нужно сначала получить такую сигнатуру типа, как String (если есть другой способ, пожалуйста, кто-нибудь мне скажет). Я знаю точный параметризованный тип, который должен иметь метод getter, поскольку он точно такой же, как поле. Но у меня есть такой тип, как экземпляр ParameterizedType.
Мой вопрос: как я могу получить эти сигнатуры типов в виде строк (включая данные параметров типов) для любого произвольного типа Java?
Спасибо за любую помощь.
1 ответ
Eclipse внутренне использует дескрипторы / подписи для исходного кода Java. Они также включают в себя общую информацию, которая может быть полезна для вас. Интерфейс IMethod может быть хорошей отправной точкой для исследования.