[英]Java Reflection: GetDeclaredFields() method call in inherited class from super class
[英]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.