获取Java Type的签名作为String

时间:2012-09-04 00:18:10

标签: java reflection bytecode javassist

我需要获取(作为String)某些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;
}

然后在调用字段createGetter的{​​{1}}方法后,该类变为:

myField

生成的getter方法的返回类型应该与字段具有相同的通用签名(代码可以在没有该字段具有相同通用签名的情况下进行编译,因为编译器只有相同的类是正常的。原因我需要它具有相同类型的通用签名,这里没有解释。)

public class TestClass{ private MyClass<String> myField; public MyClass<String> getMyField() { return MyClass<String> myField; } } 方法的代码说明了使用Javassist,为了设置方法的泛型类型签名,我首先需要获得这样的类型签名作为String(如果有另一种方式请某人告诉我)。 我知道getter方法应该具有的确切参数化类型,因为它与字段完全相同。但我有ParameterizedType的实例类型。

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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