简体   繁体   English

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

[英]Using reflection to create a class is throwing java.lang.ClassNotFoundException even for builtin types when running in TestNG

I have some code that is using reflection at a particular place to instantiate a few objects like this: 我有一些在特定位置使用反射实例化一些对象的代码,如下所示:

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

This bit of code works fine when running in the normal environment. 在正常环境中运行时,这段代码可以正常工作。 However when I try to unit test the set of methods that run these two lines, I keep getting java.lang.ClassNotFoundException exceptions. 但是,当我尝试对运行这两行的方法进行单元测试时,我一直在获取java.lang.ClassNotFoundException异常。

At first I thought it had to do with the fact that the class I was trying to instantiate wasn't being included on the classpath for some strange reason. 起初,我认为这与以下事实有关:由于某种奇怪的原因,我试图实例化的类并未包含在类路径中。 So I then did this: 因此,我这样做了:

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

And yet it still fails: 但是它仍然失败:

 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)

I've been looking into the ClassLoader and trying to determine why it can't seem to find any classes but to no avail. 我一直在研究ClassLoader,并试图确定为什么它似乎无法找到任何类但无济于事。

Does anyone know why this is happening only when TestNG is running the code and what to do about it? 有谁知道为什么只有在TestNG运行代码时才会发生这种情况以及如何处理?

Okay, I was able to figure it out. 好的,我能够弄清楚。 And of course it was incredibly dumb and makes you question all of your years being a software engineer. 当然,这是令人难以置信的愚蠢,这使您质疑作为软件工程师的所有岁月。

The problem was this line: 问题是这一行:

String className = type.toString();

The value type was of class java.lang.reflect.Type . 值类型为java.lang.reflect.Type类。

Can you see the issue? 你看到这个问题了吗? Don't feel bad if you can't because I couldn't either. 如果不能就不要难过,因为我也不能。

If you run this code: 如果运行此代码:

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

You end up with the following output: 您最终得到以下输出:

class java.lang.String
java.lang.String

The issue is quite obvious seeing that, I should be using getTypeName() not toString() . 看到这个问题很明显,我应该使用getTypeName()而不是toString() Of course it will throw ClassNotFoundException because class<SPACE> precedes the actual class name. 当然,它将抛出ClassNotFoundException因为class<SPACE>在实际的类名之前。

Yet when I looked at the stacktrace, I overlooked it had class<SPACE> before the name of the class. 但是,当我查看stacktrace时,我忽略了它在class<SPACE>名之前有class<SPACE>

Sigh. 叹。 Good times were had learning about class loaders though. 曾经有过学习类加载器的好时机。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 即使该类存在于jar文件中,也会引发java.lang.ClassNotFoundException - Throwing java.lang.ClassNotFoundException even if the class exists in jar file 使用Java Reflection,java.lang.ClassNotFoundException动态创建类 - Dynamically class creating by using Java Reflection, java.lang.ClassNotFoundException 当 class 在路径中时,Servlet 抛出 java.lang.ClassNotFoundException - Servlet Throwing java.lang.ClassNotFoundException when class in path 使用 Java 反射时出现 `java.lang.ClassNotFoundException: org.apache.commons.pool.PoolableObjectFactory` - Getting `java.lang.ClassNotFoundException: org.apache.commons.pool.PoolableObjectFactory` when using Java reflection java.lang.ClassNotFoundException抛出一些错误 - java.lang.ClassNotFoundException throwing some error 运行java -jar时的java.lang.ClassNotFoundException - java.lang.ClassNotFoundException when running java -jar 获取 java.lang.ClassNotFoundException: org.testng.TestNG 错误 - Getting a java.lang.ClassNotFoundException: org.testng.TestNG Error 运行appium脚本时出现java.lang.ClassNotFoundException - java.lang.ClassNotFoundException is comming when running appium script Gradle:java.lang.ClassNotFoundException:运行优步时 Jar - Gradle : java.lang.ClassNotFoundException : When running Uber Jar 在 IntelliJ IDEA 中运行时出现 java.lang.ClassNotFoundException - java.lang.ClassNotFoundException when running in IntelliJ IDEA
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM