java - 如何获取 Java 类结构的哈希值?

标签 java reflection

假设我有以下两个类(class):

public class A {
    private String field1;
    private B field2;
}

public class B {
    private String field3;
}

我想要做的是使用 Java Reflection 从类 A 中获取所有字段和所有子字段,并从中创建一个哈希值。在这个例子中,我会得到一个字符串列表,其中包含 ["field1", "field2", "field3"],并且我会对整个列表进行哈希处理。

如果它有帮助的话,我这样做的原因是因为我有一个 A 的 MongoDB 集合。但是,每隔一段时间,我就会向 AB 添加新字段,并且在这种情况发生时,我需要使用新字段刷新整个集合。为此,我需要在一个单独的集合中跟踪我是否已经刷新了 A 的集合的当前结构。最简单的方法是仅散列其字段和子字段名称。

最佳答案

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/reflect/FieldUtils.html#getAllFieldsList-java.lang.Class-听起来这足以解决您的问题。

处理评论,getAllFieldsList返回List<Field>所以你应该能够迭代或递归 List然后调用Field.getType()返回 Class 。现在调用getAllFieldsList再次。这应该可以让您从 A 类遍历,然后获取有关 B 类的信息。

另一个想法可能是使用 JSON_STYLE 并调用 https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/ReflectionToStringBuilder.html#ReflectionToStringBuilder-java.lang.Object-org.apache.commons.lang3.builder.ToStringStyle- 。这将递归并打印出代表 A 的 JSON然后您可以解析 JSON 并检查字段名称。

另一种途径可能是在编译时或打包时处理这个问题。除非您使用其他反射或面向方面的编程技术,否则您的类只会在编译时的开发过程中发生变化。在构建或 CI/CD 流程中检测更改,然后将这些更改输入 MongoDB 可能更有意义。

关于java - 如何获取 Java 类结构的哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70366817/

相关文章:

java - 为什么 BinaryReader 卡在 ReadString() 上而不卡在 Read() 上?

c# - 使用表达式树而不是反射来获取和设置对象属性

ruby - Ruby 中有没有办法打印出对象的公共(public)方法

c# - 如何获取基类的公共(public)静态方法?

java - 如何将根 SSL 证书作为资源包含在 J2ME 应用程序中?

java - 重新加载 java.net.http.HttpClient 的 SSLContext

java - 等待方法响应而不阻塞其他HTTP请求的流程

java - 当数组中没有项目时,RecyclerView OutOfBoundsException

java - 确定通用类型字段的类类型

java - 如何使用类中的参数返回特定方法的名称