我想通过枚举给定类集的私有字段来动态创建类组合映射。这适用于getDeclaredFields()和一组独立的类。
但是如果类包含一个类型是不可用的类的字段,则调用将失败并显示NoClassDefFoundError
。有没有办法枚举私有字段,以便我可以避免这种行为,例如逐个捕获异常并继续其余的字段?
答案 0 :(得分:1)
不是通过反思,不是。获取给定类型的所有字段(即,不知道其名称)的唯一方法是使用getDeclaredFields()
。这是一个批处理查询,它为每个字段构造一个Field
实例。如果其中一个失败,则整个呼叫失败。
答案 1 :(得分:1)
所以我找到了解决方案:
我可以使用ASM库ClassReader
访问每个字段并获取其名称。
不幸的是,即使知道名称还不足以使反思变得有用Class.getDeclaredField(name_taken_from_classreader)
仍然会因某种原因调用getDeclaredFields()
。
可以找到指向我的讨论here。
答案 2 :(得分:0)
我没有听你回答这个问题。您可以将这些字段逐个枚举到try catch(NoClassDeFoundError)块中,如果有异常,则不会对catch块中的该字段执行任何操作并转到其他字段。是你正在寻找的东西还是我误解了你的问题。
答案 3 :(得分:0)
有没有办法枚举私有字段,以便我可以避免这种行为,例如一个接一个地捕获异常并继续使用其他字段?
我不认为这是正确的方法。你不应该捕获错误。 NoClassDefFoundError
是错误。
错误是Throwable的子类,表示严重问题 一个合理的应用程序不应该试图抓住。最多的 错误是异常情况。 ThreadDeath错误,虽然是 "正常" condition,也是Error的子类,因为大多数 应用程序不应该试图抓住它。