Получить весь метод с аннотацией @Test для всех классов во всех JAR-файлах - PullRequest
0 голосов
/ 11 марта 2020

Я хочу взять все методы с @Test во всех файлах JAR со многими классами. у меня есть мой основной файл в src/main/java/it/anas/testsuiteloader/controller.java и файл jar в src/main/java/test/* <--- test - это пакет </p>

мой код:

             //TAKE ALL JAR FILE
             List<JarFile> jarList = Files.walk(Paths.get("src/main/java/test"))
            .filter(f -> f.toString().endsWith(".jar"))
            .map(Path::toFile).map(f -> {
                try {
                    return new JarFile(f);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            })
            .collect(Collectors.toList());

     //in all jar, in all class in all method

     for (JarFile j : jarList) {
         for (Enumeration<JarEntry> entries = j.entries(); entries.hasMoreElements(); ) {
            JarEntry entry = entries.nextElement();
            String file = entry.getName();

            if (file.endsWith(".class")) {
                String classname = file.replaceAll("/", ".")
                        .substring(0, file.lastIndexOf("."));


                try {
                    Class<?> currentClass = Class.forName(classname); <----ERROR!!!!
                    List<String> testMethods = new ArrayList<>();
                    for (int i = 0; i < currentClass.getMethods().length; i++) {
                        Method method = currentClass.getMethods()[i];
                        Annotation ann = method.getAnnotation(Test.class);
                        if (ann != null) {
                            testMethods.add(method.getName());
                        }
                    }//fine for metodi
                    if (testMethods.size() >1) {
                        testClassObjList.put(j.toString(),classname,testMethods);
                        System.out.format("%s %s %s",j.toString(),classname,testMethods);
                    }
                } catch (Throwable e) {System.out.println("WARNING: failed to instantiate " + classname + " from " + file); }

            }
        }

Требуется правильное имя класса:

String classname = file.replaceAll("/", ".")
                        .substring(0, file.lastIndexOf("."));  //<----- IS OK i view here class name

Но здесь у меня ошибка:

Class<?> currentClass = Class.forName(classname);  //<-----ERROR no class found! 

Некоторые СОВЕТЫ ??? Как я ищу класс в файле JAR ?? с уважением

1 Ответ

0 голосов
/ 12 марта 2020

Вы открываете файл jar (jar - это архив в формате zip) и перебираете записи в архиве. Ваша проблема в том, что вы никогда не загружали свой jar-файл в JVM, поэтому Class.forName не удастся выполнить.

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

var url = new File("YOUR_JAR.jar").toURI().toURL();
var child = new URLClassLoader(
        new URL[] {url},
        this.getClass().getClassLoader()
);
var classToLoad = Class.forName("YOUR_CLASS_FULLY_QUALIFIED_NAME", true, child);
var methods = classToLoad.getMethods();
for (var method: methods) {
    Annotation ann = method.getAnnotation(Test.class);
    if (ann != null) {
        System.out.println("method: " + method.getName());
    }
}

Вы можете легко расширить это для обработки нескольких классов и несколько банок.

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