考虑以下简单方法(尝试)加载特定名称的所有类,驻留在指定路径中的JAR文件中,即
public static List<Class<?>> getAllClasses(String name, String path)
{
File file = new File(path);
try
{
URL url = file.toURI().toURL();
URLClassLoader loader = URLClassLoader.newInstance(new URL[] {url});
JarFile jar = new JarFile(file);
Enumeration<JarEntry> entries = jar.entries();
Class<?> type;
String elementName;
List<Class<?>> classList = new ArrayList<Class<?>>();
while (entries.hasMoreElements())
{
elementName = entries.nextElement().getName();
if (elementName.equals(name))
{
try
{
type = loader.loadClass(elementName);
classList.add(type);
}
catch (Exception e)
{
}
}
}
return classList;
}
catch (Exception e)
{
}
return null;
}
如果路径中有多个JAR,则每个JAR至少有一个具有相同规范名称且具有已加载类的类,例如org.whatever.MyClass
,有没有办法在没有自定义类加载器的情况下加载所有org.whatever.MyClass
类?
答案 0 :(得分:1)
没有类只加载一次,类的键是Classloader +完全限定类名。它将检查缓存和类加载器链,如果找到类,它将不会再尝试加载它。选择哪一个是特定于实现的。
答案 1 :(得分:1)
标准类加载器在单个命名空间中加载类。如果要从不同的版本实现中查找同一个类的实例,则必须使用自定义类加载器。您的代码段是自定义加载的示例。
您可以参考已发布的详细文章here。