所以我决定尝试编写一个东西,从任何人放入文件夹的 .jar 中加载特定的 .class 文件。 (现在它只加载我的 Test.jar) 问题是,这些类在我从中加载它们的 java 项目中实现了一个接口(interface),但我收到一条错误消息,告诉我类“Klass”不存在。 我怎样才能让加载程序加载该加载程序而不是尝试使用它自己的加载程序? (另外,这就是我认为它正在做的事情,我不知道这是不是真的)
加载.jar的代码:
String filePath = new String("C:/classes/Test.jar");
URL myJarFile = null;
try {
myJarFile = new URL("file:///"+filePath);
URL[] urls = new URL[]{myJarFile};
// Create a new class loader with the directory
ClassLoader cl = new URLClassLoader(urls);
// Load in the class; MyClass.class should be located in
// the directory file:/c:/myclasses/com/mycompan
Class cls = cl.loadClass("me.bluejelly.survivalgames.classes.Test");
try {
Klass klass = (Klass) cls.newInstance();
klass.create(arg0.getName());
Main.listeners.put(arg0.getName(), klass);
Bukkit.getPluginManager().registerEvents(klass, instance);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
这是我尝试加载的文件中的代码:
package me.bluejelly.survivalgames.classes;
import me.bluejelly.survivalgames.Main;
import me.bluejelly.survivalgames.def.Klass;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.inventory.ItemStack;
public class Test implements Klass {
private String ownerName;
@Override
public void create(String pName) {
this.ownerName = pName;
Main.listeners.put(this.ownerName, this);
}
@Override
public void destroy() {
if(Main.listeners.containsKey(this.ownerName)) {
Main.listeners.remove(ownerName);
}
HandlerList.unregisterAll(this);
}
@Override
public Material getIcon() {
return null;
}
@Override
public ItemStack[] getStartingItems() {
return null;
}
@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
if(event.getPlayer().getName().equals(ownerName)) {
Bukkit.broadcastMessage("test");
}
}
}
最佳答案
您需要将主类加载器设置为新 URLClassLoader 的父级。这样它就会选择你本地的 Klass 类。
类似...
ClassLoader cl = new URLClassLoader(urls, getClass().getClassLoader());
关于java - 当接口(interface)不在子类.jar中时导入子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22034725/