Java使用ClassLoader抛ClassNotFoundException

来源:互联网 发布:matlab智能算法目录 编辑:程序博客网 时间:2024/05/16 18:40

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的情况有很多,需要进一步探索~