在我当前的项目中,我正在设置一个实用程序,以将任意数量的应用程序版本生成的字段与最新应用程序结果进行比较。例如,如果我发送包含“这是对紧急广播系统的测试”的文档,则该应用程序的生产版本可能返回以下内容:
示例A:
`{
text: "This is a test of the emergency broadcast system",
numWords: 9
}`
最新的稳定开发版本可能会吐出:
示例B:
`{
text: "This is a test of the emergency broadcast system",
numWords: 9,
notes: [ "Emergency", "Urgent"],
}`
最新版本可能会提供类似以下内容:
示例C:
`{
text: "This is a test of the emergency broadcast system",
numWords: 9,
notes: [ "Emergency", "Urgent"],
subSentences: [
sentence1: { text: "This is a test.",
numWords: 4 }
]
}`
该实用程序存储它期望应用程序返回的内容以及一个包含以下内容的结构:A)尝试比较的字段,以及B)这些包含任何子字段的结构的列表。例如,我可能要确保每个text
中的subSentence
都匹配。如果我知道每个字段的名称,我可以这样做,但是...
问题在于,为了支持可扩展性,该软件使用protobuf,而我必须使用反射。对于应用程序将返回的任何对象的内容,我无法做任何假设。我仅有的信息是该字段名称列表。例如,如果我想确保最新的版本正确理解整个句子的numWords
,则可以将该应用程序提供的对象以及包含条目{ {1}}
这带来了两个问题:
Apache Commons提供的numWords.
(在撰写本文时为3.9版)默认检查每个字段。这对于我的情况没有用,因为如果我期望示例A并且仅检查EqualsBuilder
和文本,则实用程序应该将其传递。但是numWords
不会返回true,因为样本B具有一个全新的字段。
EqualsBuilder提供了EqualsBuilder.reflectEquals(Sample A, Sample B)
方法来仅比较指定的字段,这听起来比我需要的还要多...嵌套数据对象除外。该API仅支持附加常见类型,因此我只能通过执行.append()
来轻松检查numWords
,但是无法执行类似EqualsBuilder.append(9).isEqual(Sample A)
的操作并将其用作比较。
所以,我认为我的问题归结为:有什么方法可以根据字段名称而不是字段值来比较字段?如果没有,是否有任何方法可以在不了解内部结构的情况下拔出内部结构(除了它们存在之外)?