Список классов в файле jar - PullRequest
7 голосов
/ 07 августа 2010

Как я могу динамически загрузить JAR-файл и список классов, которые в нем находятся?

Ответы [ 5 ]

11 голосов
/ 07 августа 2010

Вот код для перечисления классов в банке:

import java.io.IOException;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class JarList {
    public static void main(String args[]) throws IOException {

        if (args.length > 0) {
            JarFile jarFile = new JarFile(args[0]);
            Enumeration allEntries = jarFile.entries();
            while (allEntries.hasMoreElements()) {
                JarEntry entry = (JarEntry) allEntries.nextElement();
                String name = entry.getName();
                System.out.println(name);
            }
        }
    }
}
6 голосов
/ 19 февраля 2015

Просмотр содержимого файла JAR

Для просмотра содержимого файла JAR из командной строки используйте

jar tf jar-file

например: -

jar tf TicTacToe.jar


META-INF/MANIFEST.MF  
TicTacToe.class  
audio/  
audio/beep.au  
audio/ding.au  
audio/return.au  
audio/yahoo1.au  
audio/yahoo2.au  
images/  
images/cross.gif  
images/not.gif  
6 голосов
/ 07 августа 2010

Посмотрите на классы в пакете java.util.jar.Вы можете найти примеры того, как вывести список файлов внутри JAR в Интернете, вот пример .(Также обратите внимание на ссылки внизу этой страницы, есть еще много примеров, показывающих, как работать с файлами JAR).

4 голосов
/ 09 июня 2013

Быстрый способ: просто откройте .jar как .zip, например. в 7-Zip и найдите имена каталогов.

0 голосов
/ 11 июля 2019

Вот версия, которая сканирует данный jar для всех неабстрактных классов, расширяющих определенный класс:

try (JarFile jf = new JarFile("/path/to/file.jar")) {
    for (Enumeration<JarEntry> en = jf.entries(); en.hasMoreElements(); ) {
        JarEntry e = en.nextElement();
        String name = e.getName();
        // Check for package or sub-package (you can change the test for *exact* package here)
        if (name.startsWith("my/specific/package/") && name.endsWith(".class")) {
            // Strip out ".class" and reformat path to package name
            String javaName = name.substring(0, name.lastIndexOf('.')).replace('/', '.');
            System.out.print("Checking "+javaName+" ... ");
            Class<?> cls;
            try {
                cls = Class.forName(javaName);
            } catch (ClassNotFoundException ex)  { // E.g. internal classes, ...
                continue;
            }
            if ((cls.getModifiers() & Modifier.ABSTRACT) != 0) { // Only instanciable classes
                System.out.println("(abstract)");
                continue;
            }
            if (!TheSuper.class.isAssignableFrom(cls)) { // Only subclasses of "TheSuper" class
                System.out.println("(not TheSuper)");
                continue;
            }
            // Found!
            System.out.println("OK");
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}

Вы можете использовать этот код напрямую, когда знаете, где находятся ваши банки. Чтобы получить эту информацию, обратитесь к этому другому вопросу , так как прохождение пути к классам изменилось со времени Java 9 и введения модулей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...