Как загрузить классы из файла JAR и сохранить его в ArrayList - PullRequest
0 голосов
/ 21 марта 2012

Я пытаюсь загрузить файлы класса (которые не реализуют какой-либо общий интерфейс) из файла exchanges.jar и сохранить его в массиве. Ранее я загружал файлы .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 Ответ

7 голосов
/ 21 марта 2012

Я предполагаю, что вам нужно загрузить набор классов, расположенных в файле 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));
    }
}

Для целей загрузки вы можете использовать java.net.URLClassLoader, содержащий ваш файл jar.

Примерно так

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

Если вы хотите, чтобы этот загрузчик вторичного класса был независимым от загрузчика системного класса, убедитесь, что для родительского загрузчика класса установлено значение null при создании экземпляра URLClassLoader:

URLClassLoader loader = new URLClassLoader(new URL[]{jarFile.toURI().toURL()}, null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...