Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当接口不在subclass.jar中时导入子类_Java_Dynamic_Jar_Classloader - Fatal编程技术网

Java 当接口不在subclass.jar中时导入子类

Java 当接口不在subclass.jar中时导入子类,java,dynamic,jar,classloader,Java,Dynamic,Jar,Classloader,所以我决定尝试编写一个东西,从任何人放入文件夹的.jar中加载一个特定的.class文件。(现在它只加载我的Test.jar) 问题是,这些类在我从中加载它们的java项目中实现了一个接口,我得到一个错误,告诉我类“Klass”不存在。 我怎样才能让加载器加载它,而不是尝试使用它自己的? (还有,我认为这就是它在做的,我不知道这是不是真的) 加载.jar的代码: String filePath = new String("C:/classes/Test.jar"); URL

所以我决定尝试编写一个东西,从任何人放入文件夹的.jar中加载一个特定的.class文件。(现在它只加载我的Test.jar) 问题是,这些类在我从中加载它们的java项目中实现了一个接口,我得到一个错误,告诉我类“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());

哦,好的。我到家后会试试的。我得赶紧去上班。