【问题标题】:Finding all private fields without NoClassDefFoundError查找没有 NoClassDefFoundError 的所有私有字段
【发布时间】:2014-11-12 09:11:13
【问题描述】:

我想通过枚举给定类集的私有字段来动态创建类组合映射。这适用于具有一组隔离类的 getDeclaredFields()

但如果类包含一个类型为不可用类的字段,则调用将失败并显示NoClassDefFoundError。有没有办法枚举私有字段,以便我可以避免这种行为,例如一个接一个地捕获异常并继续处理其余字段?

【问题讨论】:

  • this 对你有帮助吗
  • 还有this一个
  • 我相信您可以通过编写自己的自定义 ClassLoader 来做到这一点,其中当尝试加载无法找到类的字段的类时,您可以自己处理异常并返回另一个 ClassProxy 的类。但是 imo,它很老套,而且不值得。

标签: java reflection


【解决方案1】:

不是通过反思,不是。动态获取给定类型的所有字段(即不知道它们的名称)的唯一方法是使用getDeclaredFields()。这是一个批处理查询,它为每个字段构造一个Field 实例。如果其中一个失败,则整个调用都会失败。

【讨论】:

    【解决方案2】:

    所以我最终找到了解决方案:

    我可以使用 ASM 库的ClassReader来访问每个字段并获取它的名称。

    不幸的是,即使知道名称还不足以让反射变得有用,因为 Class.getDeclaredField(name_taken_from_classreader) 仍会出于某种原因调用 getDeclaredFields()

    可以找到指向我的讨论here

    【讨论】:

      【解决方案3】:

      我没有让你回答这个问题。您可以将字段逐个枚举到 try catch(NoClassDeFoundError) 块中,如果出现异常,则在 catch 块中对该字段不执行任何操作并转到另一个字段。是您正在寻找的东西还是我误解了您的问题。

      【讨论】:

        【解决方案4】:

        有没有办法枚举私有字段,这样我就可以避免这种行为,例如一个接一个地捕获异常并继续处理其余字段?

        我认为这不是正确的方法。你不应该捕获错误。 NoClassDefFoundError 是一个错误。

        错误是 Throwable 的子类,表示存在严重问题 一个合理的应用程序不应该试图捕捉。大多数这样的 错误是异常情况。 ThreadDeath 错误,虽然是 “正常”条件,也是 Error 的子类,因为大多数 应用程序不应试图捕捉它。

        【讨论】:

          猜你喜欢
          • 2017-07-27
          • 2018-03-10
          • 2016-08-30
          • 1970-01-01
          • 2013-12-27
          • 2013-02-25
          • 2014-07-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多