2012-03-28 84 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

相关问题