如何从jar文件加载类并将其存储在arraylist中

时间:2012-03-21 00:03:01

标签: java jar

我正在尝试从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;
    }

}

1 个答案:

答案 0 :(得分:7)

我假设您要做的是加载位于JAR文件或任何其他URL中的一组类,然后返回包含这些类对象的列表。

我的建议是:

  • 使用班级java.util.jar.JarFile阅读广告素材中的所有条目。
  • 迭代条目,如果给定条目属于某个类(其名称以“.class”结尾),则加载该类并将其添加到已加载类的列表中。

有点像这样:

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);