使用Java反射初始化成员变量
我希望有人能指出一些有用的信息,这些信息与Java中使用反射的最佳实践有关 我支持的当前项目使用Oracle ADF Faces,我们发现,根据手头的目标,某些页面最终会有大量需要在备份bean中初始化的组件。团队中的一名开发人员设计了一个解决方案,使用bean构造函数中的反射来初始化特定页面的所有成员组件 有人担心,这可能会违反最佳实践,尽管这可能会为单个开发人员节省一些时间,但可能会影响应用程序的性能使用Java反射初始化成员变量,java,reflection,jsf,Java,Reflection,Jsf,我希望有人能指出一些有用的信息,这些信息与Java中使用反射的最佳实践有关 我支持的当前项目使用Oracle ADF Faces,我们发现,根据手头的目标,某些页面最终会有大量需要在备份bean中初始化的组件。团队中的一名开发人员设计了一个解决方案,使用bean构造函数中的反射来初始化特定页面的所有成员组件 有人担心,这可能会违反最佳实践,尽管这可能会为单个开发人员节省一些时间,但可能会影响应用程序的性能 有人以这种方式利用反射吗?这是可以接受的,还是开发人员应该手工编写代码 如果可能,应该避免
有人以这种方式利用反射吗?这是可以接受的,还是开发人员应该手工编写代码 如果可能,应该避免反射,因为您应该处理一些通常属于编译器能力的任务;此外,反射的使用使得重构更加困难,因为有些工具不能处理反射(想想eclipse的重构) 反射对性能有影响,但我认为这在可维护性方面是一个小问题
如果您有一个不使用反射的解决方案,请使用它。在可能的情况下应避免反射,因为您应该处理一些通常属于编译器能力的任务;此外,反射的使用使得重构更加困难,因为有些工具不能处理反射(想想eclipse的重构) 反射对性能有影响,但我认为这在可维护性方面是一个小问题
如果您有一个不使用反射的解决方案,请使用它。反射在web框架中无处不在。Struts2等面向操作的框架使用反射,使用请求中的参数初始化每个操作的属性。像Hibernate这样的JPA实现使用反射来初始化实体的属性。依赖注入系统(如Spring、Pico和Guice)使用反射来初始化各种对象的复杂依赖关系图
这些项目的成功证明了反射在这个应用程序中的可行性。反射在web框架中无处不在。Struts2等面向操作的框架使用反射,使用请求中的参数初始化每个操作的属性。像Hibernate这样的JPA实现使用反射来初始化实体的属性。依赖注入系统(如Spring、Pico和Guice)使用反射来初始化各种对象的复杂依赖关系图
这些项目的成功表明了该应用程序中反射的可行性。我通常选择使用Spring之类的框架进行显式初始化。过度使用反射会导致代码很难维护,或者至少很难阅读
尽管现代JVM的反射速度更快,但性能仍然会受到影响。我通常选择使用Spring之类的框架进行显式初始化。过度使用反射会导致代码很难维护,或者至少很难阅读
尽管现代JVM的反射速度更快,但性能仍然会受到影响。这取决于如何使用反射 对对象的公共API(例如在bean上使用)的反射非常有用,可以节省大量开发人员时间
针对对象私有字段的反射(或其他破坏封装的反射使用)会很快让您陷入麻烦…这取决于您如何使用反射 对对象的公共API(例如在bean上使用)的反射非常有用,可以节省大量开发人员时间
对对象的私有字段进行反射(或使用其他破坏封装的反射)会很快让您陷入麻烦…我认为您对反射的自然偏见是有充分理由的。我见过它被滥用,而且不好看
这样说,如果你的反射例程足够健壮,可以不知道成员变量的类型和成员变量的名称(也就是说,你不仅仅是在字符串中重写成员变量),所以重构类是安全的,那么我会考虑。
就性能而言,仅仅因为这个原因而拒绝反射可能是一种过早的优化,最好是进行基准测试,看看这是否是一个问题。我认为您对反射的自然偏见是有充分理由的。我见过它被滥用,而且不好看
这样说,如果你的反射例程足够健壮,可以不知道成员变量的类型和成员变量的名称(也就是说,你不仅仅是在字符串中重写成员变量),所以重构类是安全的,那么我会考虑。
就性能而言,仅仅因为这个原因而拒绝反射可能是一种过早的优化,最好是进行基准测试,看看这是否是一个问题。通常我会说同样的话,但他不是在谈论访问单个方法或变量;他说的是访问所有成员组件。这使得重构的论据有些毫无意义,我认为这些论据仍然成立。改变一个类型,瞧,什么都不起作用了,因为在反射中你用一个字符串来表示一个类型(例如);他说的是访问所有成员组件。这使得重构的论据有些毫无意义,我认为这些论据仍然成立。改变一个类型,瞧,什么都不起作用了,因为在反射中你用一个字符串来表示一个类型(例如)