Java使用ClassLoader抛ClassNotFoundException
在Java反射编程的学习中,有一次尝试使用URLClassLoader动态加载指定位置的class文件,我写了一段如下的代码:
URLClassLoader classLoader = new URLClassLoader(new URL[]{url});
Class<?> thisClass= classLoader.loadClass("com.Dapan.Example."
+ thisPath.getName().substring(0, thisPath.getName().lastIndexOf(".")));
classMap.put(thisClass.getSimpleName().toLowerCase(), thisClass);
classLoader.close();
程序编译没有问题,运行的时候也能成功加载到class文件。但是当我试图使用加载到的class文件创建对象,并传递给其他对象使用的时候,出现了问题。程序一直抛出ClassNotFoundException,可是明明已经加载成功了呀!这是为什么呢?
出现这种问题的时候,首先确认一下class的路径有没有写错,或者类名有没有错误。如果都没有错误,那么你可能犯了和我一样的错误:Java中,两个类对象必须是同一个ClassLoader加载,才能进行相应的赋值操作。如果ClassLoaderA加载的对象赋值给ClassLoaderB加载的对象,就会报错,具体抛什么异常取决于我们执行的操作。
所以,如果要使用URLClassLoader,应该在构造函数中指明需要传入的ClassLoader,例如
URLClassLoader classLoader = new URLClassLoader(this.class.getClassLoader(), new URL[]{url});
或者使用一种更加简单粗暴的方式:
URLClassLoader classLoader = (URLClassLoader)this.class.getClassLoader();
以上是我对自己遇到的问题的解决方式。当然,Java中抛ClassNotFoundException的情况有很多,需要进一步探索~