0

我目前正在为服务器开发插件。而在这个插件中,它需要从另一个文件夹中的一个类中调用方法。这是一个例子:

public class LoadSkill{
private void load(String name, String type, CastingSkill cast){
    try{
        File folder = new File(this.plugin.getDataFolder(), "Skills");
        if(!folder.exists())folder.mkdirs();
        File[] files = folder.listFiles();
        if(files.length>0){
            for(File f : files){
                String skill = f.getName();
                skill = skill.substring(0, skill.length()-4);
                if(name.equals(skill)){
                    URL loadPath = f.toURI().toURL();
                    URL[] classUrl = new URL[]{loadPath};
                    ClassLoader cl = new URLClassLoader(classUrl);
                    Class loadedClass = Class.forName("run.skill.Start", false, cl);
                    if(cast!=null)loadedClass.getDeclaredMethod(name, CastingSkill.class).invoke(loadedClass.newInstance(), cast);
                    else loadedClass.getDeclaredMethod(name).invoke(loadedClass.newInstance());
                }
                return;
            }
        }
    }catch(Exception e){
        System.err.println("Error while trying to load skill " + name + "!");
        e.printStackTrace();
    }
}
}

这将是技能文件夹中的一个 jar 文件。注意:这是不可运行的,这就是它没有 main(String[] args) 方法的原因。此外,这是唯一的课程。是的,路径确实符合上面的要求。

public class Skill implements Castable{
    public void Enable(){System.out.println("Enabled")}
    public void Cast(){System.out.println("Casting")}
    public void StopAllTimers(){System.out.println("Stopped)}
    public void AddListener(){System.out.println("Listening")}
}

然而,当我运行这段代码时,我得到一个“ClassNotFoundException”,我不知道为什么。我已经检查了几次,似乎一切都是正确的。我究竟做错了什么?

4

1 回答 1

0

你必须提到几件事:

  1. 只有当您的类位于根包中时,您的代码才有效。如果你的类有一个包名,你必须从 url 中去掉它:文件是 c:\my\classes\java\lang\String.class 那么 url 必须是 //file:/c:/my/classes。
  2. 大多数服务器都使用类加载器 hirachy,以启用动态添加类(几乎就像您尝试的那样)。如果您的类依赖于其他类,而不包含在引导类路径中,则您必须添加适当的父类加载器。
  3. 如果您的服务器是 javaEE 服务器(无论是否支持 ejb 或仅支持 servlet 运行程序)并且您不在服务器本身上工作,则 ejb 规范禁止创建自己的类加载器。这是因为没有办法以可移植的方式获得正确的父类加载器。
  4. 大多数服务器允许为不同级别的类加载层次结构上的类配置额外的路径。

如果您使用一些 javaEE 服务器,您应该在问题中指定哪一个。

于 2012-08-24T10:13:31.757 回答