0

什么时候将两个类视为相同?比如,有没有什么东西可以作为一个类的签名?如果是这样,签名、包信息、类名等有什么影响?我问这个是因为我需要动态加载一个类,而且我总是得到一个ClassNotFoundException

更详细一点:我正在使用 Eclipse。我abstract class Panelpackage com.example.project.sub1. 还有一个class Testin package com.example.project.sub2,它将调用

类加载器加载器 = 新 URLClassLoader(
        新 URL[]{新 URL("file://" + path)});
                /*路径是运行时指定的,可以是不同的
                  工作目录以外的目录。这是路径
                  到我需要加载的类文件的父目录。
                */
Class<Panel> panelClass = (Class<Panel>)loader.loadClass(className);
                //类名是运行时指定的。

这编译得很好。然后我将所有内容复制Panel.java到一个新目录中并创建了class MyPanel extends Panel一个Panel.java. 编译也很好,但是当我指定 new 的路径时MyPanel.class,我总是得到一个ClassNotFoundException. 知道我哪里错了吗?谢谢。

编辑:堆栈跟踪:

java.lang.ClassNotFoundException: MyPanel
    在 java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    在 java.security.AccessController.doPrivileged(本机方法)
    在 java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    在 java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    在 java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    在 com.example.project.sub2 (Test.java:111)
    在 java.lang.Thread.run(Thread.java:680)
4

2 回答 2

2

java.lang.ClassNotFoundException: MyPanel

该类不称为“MyPanel”,而是“com.example.project.sub1.MyPanel”。

这是我需要加载的类文件的父目录的路径。

是的,那行不通。它需要是包层次结构的根目录,所以不是“/some/path/classes/com/example/project/sub1/”,而是“/some/path/classes”

于 2013-07-17T06:08:22.030 回答
1

如果com.example.project.sub1.Panel要从文件 URL 动态加载类,则该 URL 应引用包含该目录的目录com。从那里,ClassLoader 将在与包路径匹配的子目录路径中查找类。并且要传递的类名是完全限定名:com.example.project.sub1.Panel.

此外,加载 MyPanel 类将返回 a Class<MyPanel>,而不是 a Class<Panel>。您应该Class<? extends Panel>用作变量的类型。

我不确定您为什么要动态加载类。您尝试解决的实际问题可能可以通过另一种方式解决。

于 2013-07-17T06:09:42.460 回答