2012-09-04 52 views
1

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

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

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

我需要这在应用程序的上下文中被用Javassist显影。

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

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 Type?。

感谢您的任何帮助。

回答

0

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