当前位置: 首页 > 面试题库 >

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

云煌
2023-03-14
问题内容

我在玩反射,我想做点东西来加载一个类并打印该类中所有字段的名称。我制作了一个小型的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中获取URLClassLoader(URL[])构造函数

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

因此,您有两种选择:

  1. 请参考.class文件所在的目录
  2. 将.class文件放入JAR并参考

(1)在这种情况下比较容易,但是(2)在使用网络资源时会很方便。



 类似资料:
  • 好的,基本上,我尝试使用这里描述的方法JarFileLoader来加载一个jar,其中包含一个类,该类的使用方式与类路径上的相同(类名将是动态的,因此我们可以添加任何jar任何类和程序将通过解析文本文件加载它,在主线中)。 问题是当我调试和检查URLClassLoader对象时 行: getResource()在参数中找不到类名。 有人已经尝试过用这种方式加载jar文件了吗? 谢谢。 加载器: 主

  • 问题内容: 我需要为应用程序的某些部分向现有应用程序添加插件功能。我希望能够在运行时添加jar,并且应用程序应该能够从jar中加载类,而无需重新启动应用程序。到目前为止,一切都很好。我使用URLClassLoader在线找到了一些示例,并且运行良好。 我还希望能够在罐子的更新版本可用时重新加载相同的类。我再次发现了一些示例,据我所知,实现此目标的关键是我需要为每个新负载使用一个新的类加载器实例。

  • 问题内容: 是否可以使用Javascript将CSS样式表导入html页面?如果是这样,怎么办? 附言:JavaScript将托管在我的网站上,但我希望用户能够放入其网站的标签,并且它应该能够将托管在我的服务器上的CSS文件导入当前网页。(css文件和javascript文件都将托管在我的服务器上)。 问题答案: 这是这样做的“老派”方法,希望可以在所有浏览器上使用。从理论上讲,不幸的是,您将使用

  • 问题内容: 我有一个代码生成器,它使用URLClassLoader在指定的路径上加载类,扫描它们以查找批注,然后在字段/方法上使用Reflection,生成DTO。 在测试应用中,效果很好。 当我将其放入Maven MOJO中时,突然失去了在类上看到javax.persistence.Entity批注的能力。它加载它们,可以看到所有字段,但是Entity注释不再可见。 我假设这与Classpath

  • 问题内容: 使用maven-jar-plugin时, 我想向Manifest.mf添加条目, 因此它将包含: Class-Path:。 当我将此条目添加到Pom时: 它将创建具有所有依赖项的Class-Path,例如 : Class-Path:。jar1name.jar jar2name.jar等 不仅仅是 类路径:。 有没有一种方法可以避免maven将所有jar名称添加到Class-Path?

  • 我找到了类YamlPropertiesFactoryBean,它似乎能够完成我需要的工作。 我的问题是我不确定如何在我的Spring应用程序中使用这个类(它正在使用基于注释的配置)。看来我应该使用setBeanFactory方法在PropertySourcesPlaceholderConfigurer中配置它。 以前,我使用@PropertySource加载属性文件,如下所示: