2012-09-04 68 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可能是一個很好的調查起點。