gpt4 book ai didi

java - 获取所有 JAR 文件中所有类中带注释 @Test 的所有方法

转载 作者:行者123 更新时间:2023-12-01 18:00:27 24 4
gpt4 key购买 nike

我想在具有许多类的所有 JAR 文件中采用 @Test 的所有方法。我的主要在 src/main/java/it/anas/testsuiteloader/controller.java和 jar 文件 src/main/java/test/* <---测试是一个包

我的代码是:

             //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 文件中搜索类?谢谢问候

最佳答案

您打开一个 jar 文件(jar 是 zip 格式的存档)并迭代存档中的条目。您的问题是您从未将 jar 加载到 JVM,因此 Class.forName 将失败。

您需要动态加载 jar 文件。这是我的代码,用于在动态加载的 jar 的一个类中查找注释,灵感来自 How to load JAR files dynamically at Runtime?

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

您可以轻松扩展它来处理多个类和多个 jar。

关于java - 获取所有 JAR 文件中所有类中带注释 @Test 的所有方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60644022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com