Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:查找反射代码的用法_Java_Reflection - Fatal编程技术网

Java:查找反射代码的用法

Java:查找反射代码的用法,java,reflection,Java,Reflection,我们有巨大的代码库,一些类经常通过代码中的反射来使用。我们可以安全地删除类,编译器也很高兴,但其中一些类是使用反射动态使用的,所以除了搜索字符串外,我无法找到它们 是否有用于Java代码的反射资源管理器?没有简单的工具来实现这一点。但是,您可以使用代码覆盖率。这样做的目的是为您提供一个所有执行代码行的报告。这在改进测试代码或删除死代码方面更有用 根据定义,反射是非常动态的,您必须运行正确的代码才能看到它会做什么。i、 你必须进行合理的测试。如果您可以访问此代码,您可以将日志添加到反射所做的一切中

我们有巨大的代码库,一些类经常通过代码中的反射来使用。我们可以安全地删除类,编译器也很高兴,但其中一些类是使用反射动态使用的,所以除了搜索字符串外,我无法找到它们


是否有用于Java代码的反射资源管理器?

没有简单的工具来实现这一点。但是,您可以使用代码覆盖率。这样做的目的是为您提供一个所有执行代码行的报告。这在改进测试代码或删除死代码方面更有用


根据定义,反射是非常动态的,您必须运行正确的代码才能看到它会做什么。i、 你必须进行合理的测试。如果您可以访问此代码,您可以将日志添加到反射所做的一切中,或者您可以使用这些库的指令插入(或直接更改它们)

我怀疑是否有任何这样的实用程序可用,但我可能错了

考虑到动态加载的类(通过反射)本身可以动态加载其他类,并且加载的类的名称可能来自变量或某些运行时输入,这是相当复杂的


您的代码库可能不会执行这两个操作。如果这是一次性工作,那么搜索字符串可能是一个不错的选择。或者寻找对反射方法的调用

正如其他海报所提到的,由于反射的动态性质,这无法通过静态分析完成。如果您使用的是Eclipse,您可能会发现这个覆盖率工具非常有用,并且非常容易使用。我建议您为JRE使用适当许可的源代码,修改反射类,以便在反射使用类时记录(使用map/
WeakHashMap
忽略重复项)。您修改的系统类可以在命令行中将
rt.jar
中的类替换为
-Xbootclasspath/p:
(在Oracle“Sun”JRE上,其他类可能也有类似的功能)。运行你的程序和测试,看看会出现什么


(可能您必须解决系统类中的类加载顺序问题。)

如何动态使用这些类?它们是以全名作为字符串加载的,还是在运行时计算的脚本中使用的?尽可能避免这样做。像Java这样的类型安全语言之所以如此强大并在企业系统中使用,是因为编译时类型检查可以在编译时发现大多数类型冲突——除非您使用反射来做某些事情——然后所有赌注都输光了,您回到了编程的黑暗时代,在那里您的代码嵌入了可以使用的“地雷”当您的某个用户碰巧以您未考虑过的测试方式执行某段代码时,可以随时关闭。但这只会找到在该特定程序运行中加载的内容。我建议静态地做同样的事情,并且不需要经历修改类的痛苦。对你的评论感兴趣。谢谢。@Hemal有点取决于反射的用途。反射的更有用的用途不是硬编码字符串。如果字符串是硬编码的,那么我建议对
java.lang.reflect
进行grepping并删除反射。