有没有办法让一个类的所有非null成员没有反射或吸气剂?

时间:2014-06-08 16:31:42

标签: java reflection

我有一个类可以为50+以上的变量分配值。我不想为所有这些领域编写getter。我宁愿有一些方法可以报告哪些字段已赋值给它们,以及该值是什么。

我最初把这些私有化了,我知道反射基本上是私密的。此外,Securecoding.org还说明了这一点:

  

特别是,除非可以在不使用反射的情况下访问这些项,否则不得使用反射来提供对类,方法和字段的访问。例如,不允许使用反射来访问或修改字段,除非这些字段已经可以通过其他方式访问和修改,例如通过getter和setter方法。

我主要担心的是通过声明几十个实例变量(以及可能的getter)来破坏我的代码。在本项目的后期,我还将有两组需要声明的大型实例变量。我知道我可以通过一些聪明的地图和枚举减少getter的使用,但是,仍然需要解析几十个空值。有人可以建议另一种方式吗?

1 个答案:

答案 0 :(得分:1)

我只知道4种访问类

字段的方法
  1. 直接除非字段为private
  2. 使用方法,例如吸气剂。
  3. 使用构造函数。
  4. 使用反射
  5. 方式1和4超出了讨论范围。 这里的构造函数使用不方便,因为字段数量很大。

    所以,方法的可能性。

    您是否要使用bean约定或例如构建器模式取决于您,但如果您需要此类用于持久性或序列化为XML或JSON等,则至少需要getter。

    现在,如果您只想在创建实例后验证它,您可以声明声明方法Validatable的接口validate(),并在您的对象准备就绪时调用它。但是,您必须为每个类实现和维护此方法。

    替代方法是使用可用的验证框架之一。在这种情况下,您可以使用注释完成验证。你应该记住,在场景背后这样的框架使用反射。

    以下是一些进一步阅读的链接:

    http://commons.apache.org/proper/commons-validator/

    http://java-source.net/open-source/validation

    http://docs.oracle.com/javaee/6/tutorial/doc/gircz.html