Java 使用泛型超类型动态加载类
下面代码的目的是调用initialize()方法来扩展GsonLoader的包中的所有类 我收到的错误是: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(
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;
}