【发布时间】:2014-11-12 09:11:13
【问题描述】:
我想通过枚举给定类集的私有字段来动态创建类组合映射。这适用于具有一组隔离类的 getDeclaredFields()。
但如果类包含一个类型为不可用类的字段,则调用将失败并显示NoClassDefFoundError。有没有办法枚举私有字段,以便我可以避免这种行为,例如一个接一个地捕获异常并继续处理其余字段?
【问题讨论】:
标签: java reflection
我想通过枚举给定类集的私有字段来动态创建类组合映射。这适用于具有一组隔离类的 getDeclaredFields()。
但如果类包含一个类型为不可用类的字段,则调用将失败并显示NoClassDefFoundError。有没有办法枚举私有字段,以便我可以避免这种行为,例如一个接一个地捕获异常并继续处理其余字段?
【问题讨论】:
标签: java reflection
不是通过反思,不是。动态获取给定类型的所有字段(即不知道它们的名称)的唯一方法是使用getDeclaredFields()。这是一个批处理查询,它为每个字段构造一个Field 实例。如果其中一个失败,则整个调用都会失败。
【讨论】:
所以我最终找到了解决方案:
我可以使用 ASM 库的ClassReader来访问每个字段并获取它的名称。
不幸的是,即使知道名称还不足以让反射变得有用,因为 Class.getDeclaredField(name_taken_from_classreader) 仍会出于某种原因调用 getDeclaredFields()。
可以找到指向我的讨论here。
【讨论】:
我没有让你回答这个问题。您可以将字段逐个枚举到 try catch(NoClassDeFoundError) 块中,如果出现异常,则在 catch 块中对该字段不执行任何操作并转到另一个字段。是您正在寻找的东西还是我误解了您的问题。
【讨论】:
有没有办法枚举私有字段,这样我就可以避免这种行为,例如一个接一个地捕获异常并继续处理其余字段?
我认为这不是正确的方法。你不应该捕获错误。 NoClassDefFoundError 是一个错误。
错误是 Throwable 的子类,表示存在严重问题 一个合理的应用程序不应该试图捕捉。大多数这样的 错误是异常情况。 ThreadDeath 错误,虽然是 “正常”条件,也是 Error 的子类,因为大多数 应用程序不应试图捕捉它。
【讨论】: