Java 如何搜索项目中返回集合接口实现的所有方法?
我一直在读Josh Bloch的《有效Java第二版》。第43项声明“返回空数组或集合,而不是null”。我的问题是如何搜索项目中返回java.util.Collection接口实现的所有方法?使用的IDE是Eclipse,但任何找到正确结果的方法都是可以接受的,例如regex或其他IDE。如果现有用户界面无法做到这一点,则始终可以使用反射来遍历代码。这不需要太多的工作,只需要几个嵌套循环。intellij IDEA有基于结构/表达式的搜索,因此通过搜索返回集合的所有方法,您至少可以找到接近的结果。我不知道如何找到返回类型为java.util.Collection任意实现的所有方法(包括你自己定义的那些) 如果您可以接受更有限的解决方案,那么您会想到以下几种可能性:Java 如何搜索项目中返回集合接口实现的所有方法?,java,regex,search,methods,return-type,Java,Regex,Search,Methods,Return Type,我一直在读Josh Bloch的《有效Java第二版》。第43项声明“返回空数组或集合,而不是null”。我的问题是如何搜索项目中返回java.util.Collection接口实现的所有方法?使用的IDE是Eclipse,但任何找到正确结果的方法都是可以接受的,例如regex或其他IDE。如果现有用户界面无法做到这一点,则始终可以使用反射来遍历代码。这不需要太多的工作,只需要几个嵌套循环。intellij IDEA有基于结构/表达式的搜索,因此通过搜索返回集合的所有方法,您至少可以找到接近的结
(有了所有这些,你可以点击“搜索”选项卡顶部的小向下三角形,并过滤要包含在显示中的使用类型,例如排除导入语句。)插件时间!我做了一些事情,完成了大部分工作 抓住 (如有兴趣) 将collectionmarker.zip解压到eclipse目录中(eclipse目录应该包含一个插件目录) 重新启动eclipse 工具栏上会有两个小eclipse图标——一个清除标记,一个添加标记 这个插件会搜索你工作区中的所有内容;它会忽略所做的选择 希望这有帮助!
--Scott在Eclipse帮助中找到了以下内容: 要搜索具有特定返回类型的方法,请使用“*”,如下所示:
它可以帮助查找所有返回特定类型的方法,但不返回某些接口的实现。如果您的IDE不支持结构化搜索,也可以进行检查。感谢您提到SemmleCode。要查找源代码中返回java.util.Collection子类型的所有方法,请编写:
import default
class CollectionType extends RefType {
CollectionType() {
this.getASupertype*().hasQualifiedName("java.util","Collection")
}
}
from Method m
where m.getType() instanceof CollectionType
and
m.fromSource()
select m
也就是说,我们首先定义CollectionType的含义:将java.util.Collection作为超类型的所有类型。GetAsPerType后面有一个星形,因为我们希望将该操作应用零次或多次。接下来,我们只选择返回类型为CollectionType且发生在源代码中的方法
继续,试试看:-)将查询进一步细化为那些本应返回CollectionType但可能返回null的方法是一个简单的练习。所有这些都可以通过交互方式完成,在开发查询时自动完成,并通过连续检查帮助您正确执行查询。您可以以多种不同的方式查看结果,并在分析和查询之间导航结果和代码都很容易
-奥奇
[披露:我是Semmle的首席执行官]在IntelliJ IDEA调用结构搜索中,选择现有模板“类的方法”。 该操作将添加以下模板: class $Class$ { $ReturnType$ $MethodName$($ParameterType$ $Parameter$); } 类$class${ $ReturnType$$MethodName$($ParameterType$$Parameter$); } 将“ReturnType”变量(编辑变量操作)的文本约束设置为java.util.Collection,指定“在层次结构中应用约束”以搜索子体。 对于“MethodName”变量,指定它是搜索的目标。
开始搜索,享受:)看不到这两个小小的eclipse图标…你有什么教程吗?发电子邮件给我scott@javadude.com要讨论此IntelliJ有一个警告/错误,您可以打开已为集合/映射类型返回null的查找位置(如果为数组返回null,则另一个)这将使此搜索变得多余。;)您可以添加@NotNull注释来检测值何时可以为null,但不允许为null。