繁体   English   中英

缺少依赖项的类的Java getDeclaredFields

[英]Java getDeclaredFields of a class with missing dependencies

我无法获取缺少/不使用特定依赖项的Object的声明字段。

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

当该对象导入缺少的类时,抛出NoClassDefFoundError

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

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

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

问候,
格言

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

如果它发生,该类应该永远不会在运行时有一个实例。 我不认为JRE会允许为它的字段创建缺少类的对象实例。

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

ASM / BCEL是一个很好的方向,但实际上并没有创建缺少的类(因为你不知道他们是谁)。 您使用它们来读取/解析“类文件”以解码它的签名(即getDeclaredFields而不使用类加载器)。

首先要确保你的目标插件在你的插件之前加载:你可以在你的插件之前强制它加载,通过在plugin.yml文件中添加这一行:

softdepend:[Pluginname]

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){
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM