Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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 使用泛型超类型动态加载类_Java_Superclass_Generic Programming_Supertype - Fatal编程技术网

Java 使用泛型超类型动态加载类

Java 使用泛型超类型动态加载类,java,superclass,generic-programming,supertype,Java,Superclass,Generic Programming,Supertype,下面代码的目的是调用initialize()方法来扩展GsonLoader的包中的所有类 我收到的错误是: java.lang.InstantiationException: com.salesy.utility.gson.impl.NPCSpawnsLoader at java.lang.Class.newInstance(Unknown Source) at com.salesy.utility.providers.FileClassLoader.getClassesInDirectory(

下面代码的目的是调用initialize()方法来扩展GsonLoader的包中的所有类

我收到的错误是:

java.lang.InstantiationException: com.salesy.utility.gson.impl.NPCSpawnsLoader
at java.lang.Class.newInstance(Unknown Source)
at com.salesy.utility.providers.FileClassLoader.getClassesInDirectory(FileClassLoader.java:22)
at com.salesy.utility.gson.GsonInitiator.initiate(GsonInitiator.java:18)
at com.salesy.Salesy.main(Salesy.java:43)
错误行的开头有“错误行:”

GsonLoader基本设计(并非所有代码):

FileClassLoader#getClassesInDirectory:

public static List<Object> getClassesInDirectory(String directory) {
    List<Object> classes = new ArrayList<Object>();
    for (File file : new File("./src/" + directory.replace(".", "/")).listFiles()) {
        try {
            [ERROR LINE:]Object objectEvent = (Class.forName(directory + "." + file.getName().replace(".java", "")).newInstance());
            classes.add(objectEvent);
        } catch (InstantiationException | IllegalAccessException
                | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    return classes;
}
公共静态列表getClassesInDirectory(字符串目录){
列表类=新的ArrayList();
对于(文件:新文件(“./src/”+目录。替换(“.”,“/”)).listFiles()){
试一试{
[错误行:]对象objectEvent=(Class.forName(目录+“+”+文件.getName().replace(“.java”,”).newInstance());
添加(objectEvent);
}catch(实例化异常|非法访问异常
|ClassNotFounde(异常){
e、 printStackTrace();
}
}
返回类;
}

我该怎么办?

在哪里调用Class.newInstance?这就是抛出异常的原因,我在任何地方都看不到它。或者它可能发生在load方法中,但我也看不到任何地方。getClassesDirectory调用它。该方法的代码是“我该做什么”上面的最后一段代码?。它就在classes.add(objectEvent)的正上方;好的,我看到了,谢谢。您是否试图实例化GsonLoader(抽象超类)的所有实例?我假设不是故意的,但这是我看到的唯一可能在代码中引发异常的标准。问题显然是,由于文档中未说明的原因,可能会引发此异常。我的建议是尝试用构造函数对象实例化它们,因为抛出的异常没有像Class.newInstance(我知道)这样模糊的大小写。您正在实例化内部类吗?在这种情况下,如果内部类不是声明为静态的,也可以引发此异常。这可能是“未记录”的原因之一。当您调用Class.newInstance时,您了解自己在做什么吗?这是一样的,只是你可以调用任何构造函数。Class.newInstance仅调用无参数构造函数。您需要调用Class.getConstructors或Class.getConstructor,并使用子类构造函数的参数对返回的构造函数对象调用newInstance。我会用一个代码示例来写一个答案,说明如何使用构造函数,但教程提供了一个。如果您不明白Class.newInstance是什么,我建议您从反射教程的开头开始。
public class NPCSpawnsLoader extends GsonLoader<NPCSpawnsLoader>{

@Override
public String getFileLocation() {
    return "data/loading/spawns.json";
}

@Override
public void initialize() {
    for (NPCSpawnsLoader spawns : load()) {
        hashmap.put(spawns.getId(), spawns);
    }
}
public class GsonInitiator {

/**
 * Loads all of the gson classes
 */
public static void initiate() {
    int count = 0;
    for (Object class1 : FileClassLoader.getClassesInDirectory(GsonLoader.class.getPackage().getName() + ".impl")) {
        GsonLoader<?> loader = (GsonLoader<?>) class1;
        loader.initialize();
        count++;
    }
    logger.info("Completely loaded " + count + " gson-loading classes.");
}

private static final Logger logger = Logger.getLogger(GsonLoader.class.getName());

}
public NPCSpawnsLoader(int x, int y, int z, int id, Direction direction) {
    this.id = id;
    this.x = x;
    this.y = y;
    this.z = z;
    this.direction = direction;
}
public static List<Object> getClassesInDirectory(String directory) {
    List<Object> classes = new ArrayList<Object>();
    for (File file : new File("./src/" + directory.replace(".", "/")).listFiles()) {
        try {
            [ERROR LINE:]Object objectEvent = (Class.forName(directory + "." + file.getName().replace(".java", "")).newInstance());
            classes.add(objectEvent);
        } catch (InstantiationException | IllegalAccessException
                | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    return classes;
}