两个课程何时会被视为相同?就像,有什么东西作为一个类的签名?如果是这样,那么签名,包裹信息,班级名称等都有哪些?我问这个是因为我需要动态加载一个类,我总是得到一个ClassNotFoundException
更详细一点:我正在使用Eclipse。我的abstract class Panel
中有一个package com.example.project.sub1
。 class Test
中的package com.example.project.sub2
,将调用
ClassLoader loader = new URLClassLoader( new URL[]{new URL("file://" + path)}); /*the path is specified runtime and can be in a different directory other than working directory. It's the path to the parent directory of the class file I need to load. */ Class<Panel> panelClass = (Class<Panel>)loader.loadClass(className); //class name is runtime specified.
编译好。然后我将Panel.java
中的所有内容复制到新目录中,并创建了class MyPanel extends Panel
和Panel.java
。编译也很好,但是当我指定新MyPanel.class
的路径时,我总是得到ClassNotFoundException
。知道我错了吗?感谢。
编辑: 堆栈跟踪:
java.lang.ClassNotFoundException: MyPanel at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) at com.example.project.sub2 (Test.java:111) at java.lang.Thread.run(Thread.java:680)
答案 0 :(得分:2)
java.lang.ClassNotFoundException:MyPanel
该类不称为“MyPanel”,它是“com.example.project.sub1.MyPanel”。
这是我需要加载的类文件的父目录的路径。
是的,那不行。它必须是包层次结构根目录,所以不是“/ some / path / classes / com / example / project / sub1 /”,而是“/ some / path / classes”
答案 1 :(得分:1)
如果要从文件URL动态加载类com.example.project.sub1.Panel
,则此URL应引用包含目录com
的目录。从那里,ClassLoader将在与包路径匹配的子目录路径中查找该类。要传递的类名是完全限定名:com.example.project.sub1.Panel
。
此外,取消MyPanel类会返回Class<MyPanel>
,而不是Class<Panel>
。您应该使用Class<? extends Panel>
作为变量的类型。
我不确定你为什么动态加载类。你试图解决的实际问题可能是以另一种方式解决的。