缺少依赖项的类的Java getDeclaredFields

时间:2014-07-09 09:09:15

标签: java reflection field bukkit

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

Field[] fields = OBJECT.getClass().getDeclaredFields();
当该对象导入缺少的类时,

抛出NoClassDefFoundError

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

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

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

的问候,
马克西姆

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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

softdepend:[Pluginname]

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

<?php
if (ctype_digit($_GET['id'])) {
    $deleteId = htmlspecialchars($_GET['id'], ENT_QUOTES);

    $delete = "DELETE FROM `posts` WHERE `id` = " . $deleteId;
}
?>