gpt4 book ai didi

java - 有没有一种方法可以在没有反射或 setter/getter 的情况下获取类的所有非空成员?

转载 作者:行者123 更新时间:2023-12-01 12:52:38 25 4
gpt4 key购买 nike

我有一个类,它可以为 50 多个变量赋值。我不想为所有这些字段编写 setter/getter 。我宁愿有某种方法可以报告哪些字段已分配有值以及该值是什么。

我最初将这些设为私有(private),并且我知道反射基本上会破坏私有(private)。此外,Securecoding.org 对反射进行了如下说明:

In particular, reflection must not be used to provide access to classes, methods, and fields unless these items are already accessible without the use of reflection. For example, the use of reflection to access or modify fields is not allowed unless those fields are already accessible and modifiable by other means, such as through getter and setter methods.

我主要担心的是通过声明数十个实例变量(可能还有 setter/getter )来弄乱我的代码。在这个项目的后面,我还将有两组更大的实例变量也需要声明。我知道我可以通过一些巧妙的映射和枚举来减少 getter 的使用,但是,这仍然需要解析数十个空值。有人可以建议另一种方法吗?

最佳答案

我只知道访问类字段的 4 种方法

  1. 直接,除非字段是私有(private)
  2. 使用方法,例如 setter/getter 。
  3. 使用构造函数。
  4. 使用反射

方式1和方式4不在讨论范围内。由于字段数量巨大,构造函数的使用在这里并不方便。

所以,我们来探讨一下这种可能性。

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

现在,如果您只想在实例创建后对其进行验证,您可以声明您的接口(interface) Validatable,该接口(interface)声明方法 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

关于java - 有没有一种方法可以在没有反射或 setter/getter 的情况下获取类的所有非空成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24108283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com