Java 如何使用URLClassLoader加载*.class文件?

Java 如何使用URLClassLoader加载*.class文件?,java,reflection,Java,Reflection,我在玩反射,我想我应该制作一些东西来加载一个类并打印类中所有字段的名称。 我制作了一个小型的hello world类来检查一些东西: kent@rat:~/eclipsews/SmallExample/bin$ ls IndependentClass.class kent@rat:~/eclipsews/SmallExample/bin$ java IndependentClass Hello! Goodbye! kent@rat:~/eclipsews/SmallExample/bin$ p

我在玩反射,我想我应该制作一些东西来加载一个类并打印类中所有字段的名称。 我制作了一个小型的hello world类来检查一些东西:

kent@rat:~/eclipsews/SmallExample/bin$ ls
IndependentClass.class
kent@rat:~/eclipsews/SmallExample/bin$ java IndependentClass 
Hello! Goodbye!
kent@rat:~/eclipsews/SmallExample/bin$ pwd
/home/kent/eclipsews/SmallExample/bin
kent@rat:~/eclipsews/SmallExample/bin$ 
基于以上,我得出两个结论:

  • 它位于/home/kent/eclipsews/SmallExample/bin/IndependentClass.class
  • 它起作用了!(因此它必须是一个合适的.class文件,可以由类加载器加载)
然后使用反射的代码:(标记导致异常的行)

但当我运行它时,我得到:

Exception in thread "main" java.lang.ClassNotFoundException: IndependentClass
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at InspectClass.main(InspectClass.java:14)
我的问题是:

  • 上面我做错了什么?我怎么修理它
  • 有没有办法加载几个类文件并对它们进行迭代

  • 必须向URLClassLoader提供包含.class文件的目录或jar文件:

    classUrl = new URL("file:///home/kent/eclipsews/SmallExample/bin/");
    
    是的,您可以从以下位置加载任意数量的类:

    使用默认委托父类加载器为指定的URL构造新的URLClassLoader。在父类加载器中首次搜索后,将按照为类和资源指定的顺序搜索URL假定任何以“/”结尾的URL都引用目录。否则,假定URL引用一个JAR文件,该文件将根据需要下载和打开。

    所以你有两个选择:

  • 请参考.class文件所在的目录
  • 将.class文件放入一个JAR中并引用它

  • (1) 在这种情况下更容易,但是如果您使用网络资源,(2)可能很方便。

    我也有类似的问题,但我的类文件位于名为“customElements”的包中。在这种情况下,URL需要构造到根包正上方的文件夹,并且在load方法中,应该传递包含包的类的完整名称。例如,在我的情况下;URL类似于:

    File customElementsDir = new File("D:/My Space");
    //File customElementsDir = new File("D:\\customElements");
    URL[] urls = null;
    try {
        URL url = customElementsDir.toURI().toURL();
        urls = new URL[] { url };
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    clazz = childFirstClassLoader
                .loadClass("customElements.CustomLoadableClass");
    
    实际装载量如下:

    File customElementsDir = new File("D:/My Space");
    //File customElementsDir = new File("D:\\customElements");
    URL[] urls = null;
    try {
        URL url = customElementsDir.toURI().toURL();
        urls = new URL[] { url };
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    clazz = childFirstClassLoader
                .loadClass("customElements.CustomLoadableClass");
    

    其中childFirstClassLoader是我的类加载器。

    您必须通过提供完全限定的类名来加载类,该类名是类名,其包路径为

    Class c = ucl.loadClass("com.mypackage.IndependentClass");
    

    我也有同样的问题,但我发现这是一个解决方案:

    System.getProperty("java.class.path")
    

    这将为您提供jar和类路径。从这里您可以管理您的流程。

    您在禁止警告什么?一个常见的错误是使用当前目录作为URL,但也将当前目录用于普通类。因为默认的父类是系统类加载器,所以类加载器没有机会加载该类。file:///home/kent/eclipsews/SmallExample/bins/IndependentClass.class 应该是:file:///home/kent/eclipsews/SmallExample/bin/IndependentClass.class 汤姆·霍丁:是的,课堂是原始类型的。这就是我想要的,因为我正在继续构建它,并且希望能够加载任何类。所以我不想发出这样的警告。我会记住那个常见的错误,我相信我很快就会做到的。:-)戴维德:是的,是打字错误。我现在改正了。两个答案都是正确的。我给了一个信息最多的答案。我宁愿两者都接受。好。。