gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:07:58 25 4
gpt4 key购买 nike

我正在玩反射,我想我会做一些东西来加载一个类并打印类中所有字段的名称。我制作了一个小型的 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 文件)

然后是使用反射的代码:(标记导致异常的行)

import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

public class InspectClass {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws ClassNotFoundException, MalformedURLException {
URL classUrl;
classUrl = new URL("file:///home/kent/eclipsews/SmallExample/bin/IndependentClass.class");
URL[] classUrls = { classUrl };
URLClassLoader ucl = new URLClassLoader(classUrls);
Class c = ucl.loadClass("IndependentClass"); // LINE 14
for(Field f: c.getDeclaredFields()) {
System.out.println("Field name" + f.getName());
}
}
}

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

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)

我的问题:

  1. 我在上面做错了什么?我该如何解决?
  2. 有没有办法加载多个类文件并对其进行迭代?

最佳答案

来自 Javadocs for the URLClassLoader(URL[]) constructor :

Constructs a new URLClassLoader for the specified URLs using the default delegation parent ClassLoader. The URLs will be searched in the order specified for classes and resources after first searching in the parent class loader. Any URL that ends with a '/' is assumed to refer to a directory. Otherwise, the URL is assumed to refer to a JAR file which will be downloaded and opened as needed.

所以你有两个选择:

  1. 引用.class文件所在的目录
  2. 将 .class 文件放入 JAR 并引用它

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

关于java - 如何使用 URLClassLoader 加载 *.class 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/738393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com