Java类签名和动态加载

时间:2013-07-17 05:59:12

标签: java reflection

两个课程何时会被视为相同?就像,有什么东西作为一个类的签名?如果是这样,那么签名,包裹信息,班级名称等都有哪些?我问这个是因为我需要动态加载一个类,我总是得到一个ClassNotFoundException

更详细一点:我正在使用Eclipse。我的abstract class Panel中有一个package com.example.project.sub1class 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 PanelPanel.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)

2 个答案:

答案 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>作为变量的类型。

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