【问题标题】:Java getDeclaredFields of a class with missing dependencies缺少依赖项的类的 Java getDeclaredFields
【发布时间】:2014-08-30 05:38:58
【问题描述】:

我在获取缺少/未使用特定依赖项的对象的声明字段时遇到问题。

Field[] fields = OBJECT.getClass().getDeclaredFields();

当该对象具有对缺失类的导入时,抛出 NoClassDefFoundError

我想这样做的原因是为了一个 Bukkit 插件。我想获取缺少依赖项的插件实例的字段(它们没有被使用,但插件可以启动)。

在运行时,该插件将检查是否存在所需的依赖项,并根据该依赖项加载这些特定字段。

我想到的可能解决方案:
1)虚拟创建缺少的类+包,然后使用 ASM 重试。但我真的不知道该怎么做。

问候,
马克西姆

【问题讨论】:

  • 假设你正在编写这个插件,为什么不去掉多余的导入呢?
  • 我不是在写我想获取字段的插件,所以我不能修改它们。
  • 凹凸(); //有人有答案吗?
  • @Maximvdw 评论不会影响您的帖子 AFAIK。

标签: java reflection field bukkit


【解决方案1】:

首先确保您的目标插件在您的插件之前加载: 您可以通过将此行添加到您的 plugin.yml 文件中来强制它在您的插件之前加载:

softdepend: [插件名称]

Pluginname 是你的反射目标插件。 其次,你应该只从这个插件中获取你需要的字段,而不是列出每个字段,但是如果你想获取它的所有字段,而不是仅仅反编译它的代码并制作一个自定义的字段 getter 方法:

public ArrayList<Field> getFields(Class cl,String... analyze){
    ArrayList<Field> fields=new ArrayList<Field>();
    for (String f:analyze){
        try{
            Field field=cl.getDeclaredField(f);
            field.setAccessible(true);
            fields.add(field);
        } catch (Throwable err){
        }
    }
}

【讨论】:

    【解决方案2】:

    为什么要在缺少依赖项的同时关心字段?

    如果发生这种情况,该类在运行时不应该有实例。我认为 JRE 不会允许为其字段创建缺少类的对象实例。

    如果您阅读 getDeclaredMethods,这可能意味着什么。

    ASM / BCEL 是一个很好的方向,但不能虚拟地创建缺失的类(因为你不会知道它们是谁)。您正在使用它们来读取/解析“类文件”以解码它的签名(即不使用类加载器的 getDeclaredFields)。

    【讨论】:

    • 我不想加载/获取它们。我要加载的插件具有引用引用的字段(私有 PluginB pluginb;)在运行时该插件将加载该依赖项(如果存在)。使用“getDeclaredFields”时出现 noclassdeffound 错误
    猜你喜欢
    • 2017-12-25
    • 2015-04-18
    • 2020-03-24
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多