gpt4 book ai didi

java - 在 TestNG 中运行时,即使对于内置类型,使用反射创建类也会抛出 java.lang.ClassNotFoundException

转载 作者:行者123 更新时间:2023-11-30 06:11:10 25 4
gpt4 key购买 nike

我有一些代码在特定位置使用反射来实例化一些对象,如下所示:

String className = type.toString();
Class klass = Class.forName(className);

这段代码在正常环境下运行正常。但是,当我尝试对运行这两行的方法集进行单元测试时,我不断收到 java.lang.ClassNotFoundException 异常。

起初我认为这与我尝试实例化的类由于某种奇怪的原因没有包含在类路径中有关。所以我然后这样做了:

// Where type variable points to java.lang.String rather than my own class
String className = type.toString();
Class klass = Class.forName(className);

但它仍然失败:

 java.lang.ClassNotFoundException: class java.lang.String
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)

我一直在研究 ClassLoader 并试图确定为什么它似乎找不到任何类但无济于事。

有谁知道为什么只有当 TestNG 运行代码时才会发生这种情况以及如何处理它?<​​/p>

最佳答案

好吧,我想通了。当然,这非常愚蠢,让你质疑自己作为软件工程师的所有岁月。

问题出在这一行:

String className = type.toString();

值类型属于 java.lang.reflect.Type 类.

你能看出问题所在吗?如果你不能,请不要难过,因为我也不能。

如果你运行这段代码:

System.out.println(type.toString());
System.out.println(type.getTypeName());

您最终得到以下输出:

class java.lang.String
java.lang.String

问题很明显,我应该使用 getTypeName()不是toString() .当然它会抛出 ClassNotFoundException因为class<SPACE>在实际类名之前。

然而,当我查看堆栈跟踪时,我忽略了它有 class<SPACE>在类名之前。

叹息。不过,学习类加载器是个好时光。

关于java - 在 TestNG 中运行时,即使对于内置类型,使用反射创建类也会抛出 java.lang.ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34537871/

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