1

我需要获取(作为字符串)某些 Java 类型的类型签名

例如,这是某些ParameterizedType的类型签名:

Lorg/mapackage/MyClass<Ljava/lang/String;>;

在使用 Javassist 开发的应用程序的上下文中,我需要它。

为了更好地解释我在寻找什么,我展示了一个createGetter使用 Javassist 为私有字段生成 getter 方法的方法的摘录。该字段的类型是参数化类型(即,它使用泛型)。

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;
}

然后在调用createGetterfield 的方法后myField,类变为:

public class TestClass{
  private MyClass<String> myField;

  public MyClass<String> getMyField() {
    return MyClass<String> myField;
  }
}

生成的 getter 方法的返回类型应该与字段具有相同的通用签名(代码可以在没有具有相同字段通用签名的方法的情况下编译,因为只有相同的类对编译器来说很好。我需要它的原因具有相同类型的通用签名此处不解释)。

createGetter方法的代码说明,使用Javassist,为了设置一个方法的泛型类型签名,我需要首先获得一个String这样的类型签名(如果有其他方法请告诉我)。我知道 getter 方法应该具有的确切参数化类型,因为它与字段完全相同。但我有这样的类型作为ParameterizedType的实例。

我的问题是:在给定任意 Java Type的情况下,如何将这些类型签名作为字符串(包括类型参数数据)获得?

谢谢你的帮助。

4

1 回答 1

0

Eclipse 在内部使用 Java 源代码的描述符/签名。这些还包括可能对您有用的通用信息。Interface IMethod 可能是一个很好的调查起点。

于 2012-11-29T13:38:51.147 回答