当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在TestNG中运行时,使用反射创建类即使对于内置类型也会抛出java.lang.ClassNotFoundException》经验,为你挑选了1个好方法。

我有一些代码在特定的地方使用反射来实例化一些像这样的对象:

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运行代码时才会发生这种情况以及该怎么办?



1> Josh Davis..:

好的,我能够搞清楚.当然,这是非常愚蠢的,让你质疑你作为软件工程师的所有岁月.

问题是这一行:

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在实际的类名之前.

然而,当我查看堆栈跟踪时,我忽略了它class在类的名称之前.

叹.虽然好时光了解了班级装载机.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有