两个类何时会被视为相同?比如,有什么东西可以作为一个类的签名吗?如果是,签名、包信息、类名等中包含哪些内容?我问这个问题是因为我需要动态加载一个类,并且我总是得到一个ClassNotFoundException
更详细一点:我正在使用Eclipse。我的package com.example.project.sub1
中有一个abstract class Panel
。以及package com.example.project.sub2
中的class Test
,它将调用
ClassLoader loader=新URLClassLoader(new URL[]{new URL("file://"+路径)});/*路径是在运行时指定的,可以在不同的工作目录以外的目录。这是一条路到我需要加载的类文件的父目录。*/Class<Panel> panelClass=(Class<Parel>)loader.loadClass(类名);//类名是运行时指定的。
这汇编得很好。然后,我将Panel.java
中的所有内容复制到一个新目录中,并创建了一个class MyPanel extends Panel
和Panel.java
。这也编译得很好,但当我指定新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)
java.lang.ClassNotFoundException:MyPanel
该类不称为"MyPanel",而是"com.example.projectsub1.MyPanel"。
它是我需要加载的类文件的父目录的路径。
是的,那行不通。它需要是包层次结构根目录,所以不是"/some/path/classes.com/example/project/sub1/",而是"/some/path/classes"
如果要从文件URL动态加载类com.example.project.sub1.Panel
,则此URL应指向包含目录com
的目录。从那里,ClassLoader将在与包路径匹配的子目录路径中查找类。要传递的类名是完全限定名:com.example.project.sub1.Panel
。
此外,提交类MyPanel将返回Class<MyPanel>
,而不是Class<Panel>
。您应该使用Class<? extends Panel>
作为变量的类型。
我不知道为什么要动态加载类。你试图解决的实际问题可能可以用另一种方式解决。