Java类签名和动态加载



两个类何时会被视为相同?比如,有什么东西可以作为一个类的签名吗?如果是,签名、包信息、类名等中包含哪些内容?我问这个问题是因为我需要动态加载一个类,并且我总是得到一个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&ltPanel&gt panelClass=(Class&ltParel&gt)loader.loadClass(类名);//类名是运行时指定的。

这汇编得很好。然后,我将Panel.java中的所有内容复制到一个新目录中,并创建了一个class MyPanel extends PanelPanel.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>作为变量的类型。

我不知道为什么要动态加载类。你试图解决的实际问题可能可以用另一种方式解决。

相关内容

  • 没有找到相关文章

最新更新