反射使用与java基本原理相矛盾

时间:2016-10-27 09:44:30

标签: java

我有基本的问题。 Java提供封装以隐藏来自外部世界的数据,并使用访问修饰符提供适当的访问。然后java引入了反射,它允许您从任何地方访问类中可用的所有内容。我想知道为什么需要提供反思。

1 个答案:

答案 0 :(得分:0)

在谈到封装时,您可以将Java Reflection API视为一种有用的方法,可以微调类成员的可见性,超出关键字修饰符,例如" private"或"受保护" 。假设您需要限制内部状态对业务逻辑的可见性,但您需要为依赖注入(DI)框架,ORM或其他一些通用基础架构提供对该状态的访问。有三种方法可以做到:

  1. 您公开了公共访问者,这会不必要地污染业务API(因为它们也可以被业务逻辑使用,这是不可取的)。
  2. 您实现了一个类似ActiveRecord的模式,其中一个对象知道如何将自己存储在数据库中,序列化为XML或获取依赖项。
  3. ORM和DI将使用反射来获取有关内部状态的信息,并准备供业务逻辑使用。
  4. 最后一种方法通常更好,因为它允许保持公共API干净(不是第一种方法的情况)和架构松散耦合(像ActiveRecord这样的模式违反了单一责任原则,在同一个对象上放了太多的帽子)。

    此外,通过反思访问私人成员并不是绝对的:它仍然可以得到保护。 Java安全机制允许阻止对未授权客户端的私有成员的访问(查看Field :: get和Method :: invoke上的异常列表)。