Получение подписи типа 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 может быть хорошей отправной точкой для исследования.

Другие вопросы по тегам