2

如果我在运行时使用 URLClassLoader 从文件中加载一个类:

ClassLoader classLoader = new URLClassLoader(new URL[] { classesUrl }, getClass().getClassLoader());
String name = fileName.replace("\\", ".").replace("/", ".").substring(0, s.lastIndexOf("."));

System.out.println("loading class " + name);
Class c = classLoader.loadClass(name);
System.out.println("loaded " + c.getCanonicalName()); // 1

这似乎工作 - 输出1is loaded com.robert.test.NumberUtil

如果我然后尝试使用创建该类的实例

Class.forName("com.robert.test.NumberUtil");

我得到一个ClassNotFoundException: com.robert.test.NumberTest. 我正在尝试做的事情可能吗?或者我是否必须使用该类1(即使用从返回的对象classLoader.loadClass(),一旦超出范围重新加载它?)。

4

2 回答 2

3

Class.forName()不会创建您的类的新实例,它只是尝试查找Class该类的对象。要创建一个新实例,您可以在某个 Class 对象上使用 newInstance():

Object something = c.newInstance(); // use proper type instead of Object!

这仅适用于使用默认构造函数实例化类;否则你必须使用反射来实例化一个对象。

另请注意,创建新的 ClassLoader 不会立即影响类加载行为。对于上面的示例,您必须调用

Class.forName("com.robert.test.NumberUtil", true, c); // pass explicit ClassLoader

要使您的 ClassLoader 替换当前的 ClassLoader,您可能想说

Thread.currentThread().setContextClassLoader(c)
于 2013-07-15T21:52:02.517 回答
0

我解决了它。我试图编译 JUnit 测试,然后加载生成的类,并运行任何用 注释的类@RunWith(Suite.class),但是当我尝试将类传递给 JUnitCore 时,加载的类似乎丢失了。

无论如何,因为这是一个自定义的 Ant 任务,所以我使用了 Ant JUnitTask 类,并使用类的规范名称来运行并将编译后的测试目录添加到 JUnitTask 类路径中。

于 2013-07-24T17:56:15.403 回答