Java-Iterate+;实例化类的目录
我有一个名为Java-Iterate+;实例化类的目录,java,file,class,object,dynamic,Java,File,Class,Object,Dynamic,我有一个名为Intent的Java类。在一个名为Intent的目录中,我定义了几个Intent的子类。现在,在我的runner类中,我想将每个子类实例化为一个数组列表,如下所示: public static String parseTranscript(String transcript) { ArrayList<Intent> intents = new ArrayList<Intent>(); File[] intentFiles = new Fil
Intent
的Java类。在一个名为Intent
的目录中,我定义了几个Intent
的子类。现在,在我的runner类中,我想将每个子类实例化为一个数组列表,如下所示:
public static String parseTranscript(String transcript) {
ArrayList<Intent> intents = new ArrayList<Intent>();
File[] intentFiles = new File("./intents").listFiles();
for (File fileName : intentFiles) {
//for each of the intents defined in "intents/",
//create a new class and add to the array list.
//intents.add(new fileName.ObjectName());
}
}
我们的目标是这样做,而不必手动定义runner中的每个子类。您可以这样尝试。使用
Class.forName
,然后检查getSuperclass
是否返回Intent
ArrayList<Intent> intents = new ArrayList<Intent>();
String pathName = "./intents";
File[] intentFiles = new File(pathName).listFiles();
for (File fileName : intentFiles) {
if (fileName.isFile() && fileName.getName().endsWith(".class")) {
String className = packageName + '.' + fileName.getName().substring(0, fileName.getName().length() - 6);
Class<?> aClass = Class.forName(className);
if (aClass.getSuperclass().equals(Intent.class)) {
Constructor<?> firstConstructor = aClass.getConstructors()[0];
Intent o = (Intent) firstConstructor.newInstance(null);
intents.add(o);
}
}
}
要获得正确的构造函数,可能需要在以下方面进行更改:
Constructor<?> firstConstructor = aClass.getConstructors()[0];
Constructor firstConstructor=aClass.getConstructors()[0];
这取决于您运行的环境。一般来说,作为基线,我建议查看。
String pathName = Thread.currentThread().getContextClassLoader()
.getResources("intents").nextElement().getFile();
Constructor<?> firstConstructor = aClass.getConstructors()[0];