我正在尝试使用反射Rod
从 jar 文件中加载自定义对象 ()。我已经设法让它找到 jar 文件并扫描类以获取所需的注释,但是每当我调用时,classLoader.loadClass()
我都会得到一个ClassNotFoundException
我试图加载的类扩展的类。
这是类加载器的代码:
public static Set<Rod> getRods(File rodDirectory) throws Exception {
rodDirectory.mkdir();
URLClassLoader classLoader;
Set<Rod> rods = new HashSet<Rod>();
for (File f : rodDirectory.listFiles()) {
if (f.isDirectory() || !f.getName().endsWith(".jar"))
continue;
JarFile jar = new JarFile(f);
Enumeration<JarEntry> e = jar.entries();
classLoader = URLClassLoader.newInstance(new URL[]{new URL("jar:file:" + f.getAbsolutePath() + "!/")});
while (e.hasMoreElements()) {
JarEntry j = (JarEntry) e.nextElement();
if(j.isDirectory() || !j.getName().endsWith(".class")){
continue;
}
Class<?> c = classLoader.loadClass(j.getName().substring(0, j.getName().length() - 6));
CustomRod a = c.getAnnotation(CustomRod.class);
if (a == null)
continue;
if (a.minimumVersion() < RodsTwo.getVersion())
continue;
rods.add((Rod) c.getConstructor().newInstance());
}
jar.close();
}
return rods;
}
这是我试图加载的 jar 中的代码:
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import ca.kanoa.RodsTwo.Objects.ConfigOptions;
import ca.kanoa.RodsTwo.Objects.CustomRod;
import ca.kanoa.RodsTwo.Objects.Rod;
@CustomRod(minimumVersion=1.001)
public class Test extends Rod {
public Test() throws Exception {
super("Test", 1, 46, new ConfigOptions(), 200);
}
@Override
public boolean run(Player arg0, ConfigurationSection arg1) {
arg0.sendMessage("HI!");
return true;
}
}
我的所有其他代码都可以在这里找到。
我刚刚开始玩反射和任何帮助都很棒!