2012-02-01 55 views
0

我建立使用ASM 4.0依賴搜索工具,我發現,我一直未能解決一個角落案件的一般特徵。我遇到的問題與在下面的代碼中識別MyClass的用法有關。使用ASM找到「隱含的」變量

public void aMethod() { 
    new ArrayList<? extends MyClass>(); 
} 

ArrayList中的使用可以使用MethodVisitor.visitTypeInst()被識別,但沒有簽名方法是在該範圍內可用於識別在通用類型參數的使用。 MethodVisitor.visitLocalVariable()也不是解決方案,因爲沒有創建本地變量。如果一個局部變量被明確宣佈爲:

public void aMethod() { 
    ArrayList<? extends MyClass> list = new ArrayList<? extends MyClass>(); 
} 

的MethodVistor.visitLocalVariable()工作正常,因爲它使您能夠通過簽名PARAM泛型類型的信息。只有在隱含情況下,如果沒有本地變量聲明爲,我不能找到一種方法來訪問泛型類型參數。

我假設有某種方式與該代碼的通用信息訪問類的屬性,但我不能確定如何做到這一點。

感謝您的任何幫助!

+1

'new ArrayList <?擴展MyClass>()'是無效的Java語法 – user102008 2012-02-01 22:01:49

+0

我相信它是;他正在指定類型通配符的上限。 [鏈接](http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1) – 2012-04-22 12:59:39

回答

2

在方法機構類型參數信息字節代碼生成過程中被丟棄。您將無法通過分析字節碼來獲取它。

+0

我不知道這是正確的。如果代碼更改爲包含本地var聲明,即ArrayList list = new ArrayList (),則在執行MethodVisitor.visitLocalVariable()時,可以使用簽名(包括類型參數)。我的理解是,所有泛型類型參數信息都存儲爲類屬性...問題是如何使用ASM訪問適當的屬性。 – bloatedfish 2012-02-01 17:02:20

+2

關於局部變量的信息是可選的,並且只能用於debuggng接口。 – 2012-02-01 18:39:57

+0

我站好了。調試信息可能確實包含局部變量類型。 – 2012-02-02 08:09:47

0

獲取此信息的唯一方法是使用調試信息。如果它在那裏,你可以嘗試推斷局部變量的名稱和類型。如果它不在那裏,你只能根據類的使用方式來推斷類型。