Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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_Jvm - Fatal编程技术网

Java 为什么依赖反思是不可取的?

Java 为什么依赖反思是不可取的?,java,reflection,jvm,Java,Reflection,Jvm,我读过的许多网站和书籍都指出: 在Java中依赖反射是个坏主意,您应该寻找其他方法来测试/连接封装的对象 然而,我找不到任何实际的原因,这与不同JVM的安全管理器有关吗?或者除此之外还有其他原因吗?反射在很多方面都非常有用。最好的例子之一是创建一个允许第三方插件的程序。反思是伟大的。然而,如果使用它,可能会导致许多其他问题,包括更多的运行时错误而不是编译错误、较慢的调用,以及IDE的重构和代码分析问题(这并不总是一个大问题) 一般来说,如果你认为你可以做一些没有思考的事情,那么就不要思考。有一个

我读过的许多网站和书籍都指出:

在Java中依赖
反射
是个坏主意,您应该寻找其他方法来测试/连接封装的对象


然而,我找不到任何实际的原因,这与不同JVM的安全管理器有关吗?或者除此之外还有其他原因吗?

反射在很多方面都非常有用。最好的例子之一是创建一个允许第三方插件的程序。反思是伟大的。然而,如果使用它,可能会导致许多其他问题,包括更多的运行时错误而不是编译错误、较慢的调用,以及IDE的重构和代码分析问题(这并不总是一个大问题)


一般来说,如果你认为你可以做一些没有思考的事情,那么就不要思考。有一个非常小的灰色区域,反射是一个好主意。找到灰色区域需要实践。

反射在很多方面都非常有用。最好的例子之一是创建一个允许第三方插件的程序。反思是伟大的。然而,如果使用它,可能会导致许多其他问题,包括更多的运行时错误而不是编译错误、较慢的调用,以及IDE的重构和代码分析问题(这并不总是一个大问题)


一般来说,如果你认为你可以做一些没有思考的事情,那么就不要思考。有一个非常小的灰色区域,反射是一个好主意。找到灰色区域需要练习。

它通常会导致程序速度减慢,甚至没有必要,除非您正在进行一些遥远的元编程。很多时候,人们会问“我如何使用反射来实现这一点”,答案是“不要使用反射”。从我所知,反射会影响性能,代码通常不干净,也不容易维护。除了安全管理人员可能会提出一个问题之外,我不会说在使用反射时会有很多问题,这只是被认为是一种不好的做法。除了@Wayne所说的维护之外,反射通常涉及到为需要检索的包/类硬编码一个字符串参数。重构很可能无法捕获这些字符串并导致一些bug。可能很容易找到bug,但维护工作却很难做到:看看它有多难看:
System.out.println(Class.forName(cntr.getClass().getCanonicalName()).getField(“str”).toString()@zlakad是的,没错。您需要的是字段的值,而不是字段对象的字符串表示形式。注意,我在调用中使用了javadoc类型的引用。一个示例引用是
getField(“str”).getValue()
,它通常会导致您的程序速度减慢,除非您正在进行一些遥远的元编程,否则甚至没有必要这样做。很多时候,人们会问“我如何使用反射来实现这一点”,答案是“不要使用反射”。从我所知,反射会影响性能,代码通常不干净,也不容易维护。除了安全管理人员可能会提出一个问题之外,我不会说在使用反射时会有很多问题,这只是被认为是一种不好的做法。除了@Wayne所说的维护之外,反射通常涉及到为需要检索的包/类硬编码一个字符串参数。重构很可能无法捕获这些字符串并导致一些bug。可能很容易找到bug,但维护工作却很难做到:看看它有多难看:
System.out.println(Class.forName(cntr.getClass().getCanonicalName()).getField(“str”).toString()@zlakad是的,没错。您需要的是字段的值,而不是字段对象的字符串表示形式。注意,我在调用中使用了javadoc类型的引用。示例引用是
getField(“str”)。与编写自然Java代码相比,getValue()
反射应该是最后的选择,尽管在某些情况下,反射是可用的最佳选择+1与编写自然Java代码相比,反射应该是最后的选择,尽管在某些情况下,它是可用的最佳选择+1.