我正在尝试从exchanges.jar文件加载类文件(不实现任何通用接口)并将其存储在arraylist中 以前,我使用
从目录加载了.class文件(实现了一个公共接口)package edu.uh.cs.assign2;
import java.io.File;
import java.util.ArrayList;
import edu.uh.cs.iexchangeservices.IExchange;
public class ExchangeManager {
private ArrayList<IExchange> exchangeList = new ArrayList<IExchange>();
public ArrayList<IExchange> findClasses() throws Exception {
File classDirectoryPath = new File(Thread.currentThread()
.getContextClassLoader()
.getResource("exchangeservices".replace('.', '/')).getFile());
return loadExchangeClasses(classDirectoryPath);
}
public ArrayList<IExchange> loadExchangeClasses(File classDirectoryPath)
throws Exception {
if (!classDirectoryPath.exists())
throw new LoadExchangesException("path not found");
String[] exchangeClasses = classDirectoryPath.list();
for (String exchangeClass : exchangeClasses) {
if (exchangeClass.endsWith(".class")) {
Object object = (IExchange) Class.forName(
"exchangeservices"
+ '.'
+ exchangeClass.substring(0,
exchangeClass.length() - 6))
.newInstance();
if (object instanceof IExchange)
exchangeList.add((IExchange) object);
}
}
return exchangeList;
}
}
答案 0 :(得分:7)
我假设您要做的是加载位于JAR文件或任何其他URL中的一组类,然后返回包含这些类对象的列表。
我的建议是:
java.util.jar.JarFile
阅读广告素材中的所有条目。有点像这样:
JarFile jar = new JarFile(jarFile);
for(JarEntry entry: Collections.list(jar.entries())){
if(entry.getName().endsWith(".class")){
String className = entry.getName().replace("/", ".").replace(".class","");
foundClasses.add(loader.loadClass(className));
}
}
出于加载目的,您可以使用包含jar文件的java.net.URLClassLoader
。
有点像这样
File jarFile = new File("./jedis.jar");
URLClassLoader loader = new URLClassLoader(new URL[]{jarFile.toURI().toURL()});
您最终将获得foundClasses
列表中所有已加载的类。
另一方面,如果您确切地知道要加载的类,那么URLClassLoader应该足以解决问题。
File jarFile = new File("./jedis.jar");
URLClassLoader loader = new URLClassLoader(new URL[]{jarFile.toURI().toURL()});
foundClasses.add(loader.loadClass("jedi.academy.ObiWan"));
foundClasses.add(loader.loadClass("jedi.academy.Luke"));
foundClasses.add(loader.loadClass("jedi.academy.Anakin"));
如果您希望此辅助类加载器独立于系统类加载器,请确保在实例化URLClassLoader时将父类加载器设置为null:
URLClassLoader loader = new URLClassLoader(new URL[]{jarFile.toURI().toURL()}, null);