2012-03-28 80 views
2

有什麼方法可以使用JDT ASTParser,通過它我們可以確定方法聲明是否在匿名內部類中?如何檢查MethodDeclaration是否屬於內部類

我正在創建一個Eclipse插件來查找項目中未使用的公共方法。我在MethodDeclaration節點上使用ASTVisitor,然後使用JDT搜索。問題是,當遍歷每個Java類時,我正在訪問匿名內部類像Listener的MethodDeclaration。我需要避免這些方法。

在此先感謝。

+0

以及如果這個匿名類使用了一個方法呢?如果你沒有看到,你可能會認爲這種方法已經死亡。我想你不想跳過內心階層。 – 2012-03-29 08:07:34

+0

我不會將內部類移出我的搜索範圍。事實上,我正在循環該項目,並獲得符合某些命名標準的Java文件。然後我使用ASTParser解析這些文件並列出公共方法。然後,我將整個工作區作爲範圍執行每種方法的參考搜索。我的要求是,我不需要執行參考內部類的方法搜索,因爲我使用的文件只有ActionListeners,SelectionListeners等內部類。 – 2012-03-29 09:21:34

+0

我能夠通過使用:node.getParent()。getParent()。getNodeType()== ASTNode.CLASS_INSTANCE_CREATION'來識別方法是否對應於內部類。但不確定這是否會在所有情況下都有效。斯蒂爾得到任何答案... – 2012-04-02 06:56:17

回答

1

最後我找到了一個解決方案。 ASTParser中有一個AnonymousClassDeclaration ASTNode,它表示Java文件中的匿名內部類。當訪問這些節點時,我們可以指定不需要完全訪問這些節點(通過返回false)。

public boolean visit(AnonymousClassDeclaration classDeclarationStatement) { 

     return false; 

    } 
1

如果CLASS_INSTANCE_CREATION是匿名類的節點類型,那應該起作用。我不是Java專家;在我看來有幾種方法可以創建一個匿名類,所以你需要檢查這個節點類型是否覆蓋了它們。

...您的匿名偵聽器(?)類是否必須繼承/實現偵聽器接口?如果是這樣的話,你應該可以爬到CLASS_INSTANCE_CREATION附近樹的繼承/實現子句部分,並檢查它是否確實實現了/繼承了你期望的。要做到這一點,你需要全名和類型解析;只是因爲接口名拼寫「聽衆」並不意味着它是你想要的那個

+0

我沒有直接實現這個接口。我實例化已經實現了這個接口的類,並覆蓋它裏面的方法。但是,當你有回答時,我仍然需要找出匿名類是否繼承了Listener。 – 2012-04-04 03:58:40

相關問題