我希望有人可以指出一些有关在Java中使用Reflection的最佳实践的有用信息。
我支持的当前项目使用Oracle ADF Faces,我们发现根据手头的目标,某些页面最终会有大量需要在后台bean中初始化的组件。团队中的一位开发人员使用bean构造函数中的反射设计了一个解决方案,以初始化特定页面的所有成员组件。
有人担心这可能会违反最佳做法,虽然它可能会使个别开发人员节省一些时间,但可能会影响应用程序的性能。
有没有人以这种方式使用反射?可接受还是开发人员应手动写出代码?
答案 0 :(得分:4)
应该尽可能避免反思,因为你应该处理一些通常具有编译能力的任务;此外,反射的使用使得重构变得更难,因为有些工具不适用于反射(想想eclipse的重构)。
反思对表演有影响,但我认为这对于可持续性问题来说是一个小问题。
如果您的解决方案不使用反射,请使用它。
答案 1 :(得分:1)
我通常选择使用Spring等框架进行显式初始化。过度使用反射会导致代码难以维护或至少难以阅读。
虽然现代JVM的反射速度更快,但您仍然会受到性能影响。
答案 2 :(得分:0)
反思在Web框架中无处不在。面向操作的框架(如Struts2)使用反射来使用请求中的参数初始化每个操作的属性。像Hibernate这样的JPA实现使用反射来初始化实体的属性。像Spring,Pico和Guice这样的依赖注入系统使用反射来初始化各种对象的复杂依赖图。
这些项目的成功表明了该应用程序中反射的可行性。
答案 3 :(得分:0)
这取决于你如何使用反射...
对对象' public API的反思(例如在bean上使用introspection)非常有用,可以节省大量的开发人员时间。
反对对象'私有字段(或其他封装破坏使用反射)可以很快让你陷入困境......
答案 4 :(得分:0)
我认为你对反思的自然偏见是有道理的。我看到它被滥用了,它并不漂亮。
话虽如此,如果您的反射例程足够强大,可以不知道成员变量的类型和成员变量的名称(也就是说,您不仅仅是在字符串中重写成员变量),那么重构班级显然是安全的,然后我会考虑它。
就性能而言,仅仅因为这个原因拒绝反射可能是一种过早的优化,而且可能更好地进行基准测试,看看它是否是一个问题。