如何使用自定义的ClassLoader?

2024-02-09

大家好,感谢您的关注!我有一个必须既简单又明显的问题,但我却陷入困境。

我想通过自定义类加载器提供动态创建的 Java 类,供第三方库使用。

现在我的问题是:当我自己不直接加载这些类时,如何设置自定义类加载器来加载这些类?

我想当我使用我的ClassLoader加载某个类时,它就成为了这个类的ClassLoader,并且从该类加载的所有类都将通过我的ClassLoader进行引导。

我按照官方教程创建了一个自定义类加载器:http://java.sun.com/developer/onlineTraining/Security/Fundamentals/magercises/ClassLoader/help.html http://java.sun.com/developer/onlineTraining/Security/Fundamentals/magercises/ClassLoader/help.html.

public class DynamicClassloader extends ClassLoader {

    private Map<String, Class<?>> classesMap = new HashMap<String, Class<?>>();

    public DynamicClassloader(ClassLoader parent) {
        // Also tried super(parent);
        super(sun.misc.Launcher.getLauncher().getClassLoader());
    }

    // Adding dynamically created classes
    public void defineClass(String name, Class<?> clazz) {
        classesMap.put(name, clazz);
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        // load from parent
        Class<?> result = findLoadedClass(name);
        if (result != null) {
            return result;
        }
        try {
            result = findSystemClass(name);
        } catch (Exception e) {
            // Ignore these
        }
        if (result != null) {
            return result;
        }
        result = classesMap.get(name);
        if (result == null) {
            throw new ClassNotFoundException(name);
        }
        return result;
    }
}

我想在代码的其他地方使用它,如下所示:

ClassLoader thisClassLoader = this.getClass().getClassLoader();
((DynamicClassloader) thisClassLoader).defineClass(className, dynClass);

现在我的问题是当我打电话时findSystemClass(name)对于第 3 方库类,父类加载器会找到该类(因为它位于类路径上)并成为其类加载器。由于父类加载器不知道我的自定义类加载器,因此它实际上已不再使用并且this.getClass().getClassLoader()无法转换为 DynamicClassLoader。

另一种方法是通过 JVM 参数将我的 ClassLoader 设置为系统 ClassLoader-Djava.system.class.loader=my.DynamicClassloader。但这给了我一个 StackOverflowError:

    ...
at de.unisaarland.cs.st.DynamicClassloader.findClass(DynamicClassloader.java:39)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.ClassLoader.findSystemClass(ClassLoader.java:916)
at de.unisaarland.cs.st.DynamicClassloader.findClass(DynamicClassloader.java:39)
    ...

这一定很容易做到,但我现在没有主意了……非常感谢任何帮助!


不确定我是否理解这个问题,您有一个第三方库,并且希望它使用您的类加载器来加载类。

如果你幸运的话,第三方库使用线程上下文类加载器,你可以使用它来设置Thread.currentThread().setContextClassLoader(myClassLoader),在同一个线程中,您可以使用以下方式访问此类加载器Thread.currentThread().getContextClassLoader()...

另一点,但不确定它在您的上下文中是否重要,是您还可以编写一个父级最后的类加载器,它将在委托给其父级之前尝试加载该类(而不是首先尝试委托)

在您发表评论后编辑:

如果您的库不依赖于线程上下文类加载器,parent_last 类加载器将会产生影响,那么您必须使用父级最后一个类加载器加载该库,从而将您的类加载器设置为该库的类加载器,而不是其父加载器(父加载器)你的类加载器)...

您还可以创建一个具有父级优先行为的类加载器,但对于您的第 3 方库......

还有一个关于类加载器的好链接...... https://analyzejava.wordpress.com/2014/09/25/java-classloader-write-your-own-classloader/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用自定义的ClassLoader? 的相关文章

随机推荐

  • “GridView1”触发了未处理的事件 PageIndexChanging

    我正在使用 gridview 我想使用分页 我已经将允许分页设置为 true 并将页面大小设置为 5 我可以看到 gridview 底部的数字 但是当我单击数字移动到相应页面时 它会抛出错误 The GridView GridView1 f
  • Windows Batch 中嵌套循环中的“继续”等效命令

    我有一个批处理文件 其中包含嵌套循环continue类似命令 for i in 1 2 4 8 16 32 64 128 256 do for j in 1 2 4 8 16 32 64 128 256 do if i gtr j goto
  • jdk1.7/jre/lib/rt.jar的访问限制

    大家好 我在创建 JAXB 解析器时遇到了一个非常奇怪的问题 当我尝试从 eclipse 生成 JAXB 类时 在一个类中它显示了一个非常奇怪的错误 即 Access restriction The type QName is not ac
  • 无法解析 org.tensorflow:tensorflow-lite:0.0.0-nightly

    我下载了最新的tensorflow lite demo 展示一下 Unable to resolve dependency for app debug compileClasspath Could not resolve org tenso
  • 可以阻止 Django 截断长表名吗?

    我将 Django 与现有的 Oracle 数据库 即表不是由 Django 创建的数据库 一起使用 因此 在我的模型中 我必须通过在 Meta 类中指定 db table 的值来指示表名称 我遇到了问题 因为我希望访问的表属于与我拥有凭据
  • 使用多个模板显示页面内容 - WordPress

    是否可以有这样的页面 www site com page 并使用以下命令显示不同的模板版本 www site com page template default www site com page template archive 因此它检
  • C++ 联合体、结构体、成员类型

    如果我有课 class Odp int i int b union long f struct WCHAR pwszFoo HRESULT hr 联合意味着 在列出的所有值中 它一次只能采用其中一个值 就访问这些变量而言 它是如何工作的 我
  • 如何在Python中的图像上打印印地语句子(unicode)?

    我有一个名为 hindi txt 的文件 其内容如下 我使用的是Python3 5 9 59000 Cr 36 WhatsApp Allo 10 150
  • 在 Cython 中分配中间多维数组而不获取 GIL

    我正在尝试使用 Cython 并行化涉及生成中间多维数组的昂贵操作 以下非常简化的代码说明了我正在尝试做的事情 import numpy as np cimport cython cimport numpy as np from cytho
  • 从 Windows NT 设备路径转换为驱动器号路径

    如何解析设备路径中带有驱动器号的路径 例如 转换 Device HarddiskVolume4 Windows System32 RuntimeBroker exe into C Windows System32 RuntimeBroker
  • 在 xml 文件中搜索数据的最佳方法?

    在我们的新项目中 我们必须提供搜索功能来从数百个 xml 文件中检索数据 下面我简要介绍了我们目前的计划 我想知道您对此的建议 改进 这些 xml 文件包含个人信息 搜索基于其中的 10 个元素 例如姓氏 名字 电子邮件等 我们当前的计划是
  • grep -f 的性能问题

    我正在使用 grep 在单个文件中搜索多个正则表达式 特别是 我正在考虑100 MB 文件 带英文字幕 https drive google com open id 0B3oOQ14 tellNzhlU0tKT2xFSW8并运行存储在文件中
  • ng-click 在 ag-grid 单元格内不起作用

    我正在使用 ag grid 我需要在单元格中添加一些自定义链接 并希望在其上调用 ng click 函数 这是我的代码 var columnDefs headerName ID field id headerName Template Na
  • 为什么赋值在 Angular 表达式中并不总是有效?

    我刚刚发现 Angular 表达式中允许的内容存在这种有趣的明显不一致 可以在表达式中执行赋值 如果赋值涉及 ngRepeat 中的局部变量 则会中断 这可以通过使用控制器中定义的 setter 而不是表达式中的赋值来克服 参见普朗克 ht
  • 从 SQL 列中选择特定字符

    我有列名BOOKNAME in BOOKS表可以包含除字母数字之外的许多特殊字符 例如 如何编写一个查询来仅显示所有行中的特殊字符并将它们联合起来 例如 Row number Book name 1 Alice inWonder Land
  • Xcode 4.5.2 是否自动在合成的 BOOL getters 前面添加 is 前缀

    我刚刚注意到我有一个 BOOL 声明为 property nonatomic assign BOOL userAuthorized 我正要为它编写自己的 getter 并自动 Xcode 自动完成 BOOL isUserAuthorized
  • C# 调用 C++ dll 获取 EntryPointNotFoundException

    我得到了一个 C dll 文件 一个lib文件和头文件 我需要从我的 C 应用程序中调用它们 头文件看起来像这样 class Clog class EXPORT MACRO NB DPSM private string sFileNameT
  • 在嵌套数组上使用 $unwind 的后果?

    假设我有 17 000 个文档 其结构类似于以下文档 someInfo blah blah blah and another dozen or so attributes here followed by answers email ema
  • 使用 iOS 5 外观 API 的 UIBarButtonItem StyleDone 背景图像

    如何为具有 UIBarButtonItemStyleDone 样式和 编辑 完成 按钮的编辑状态的栏按钮提供视觉上不同的栏按钮项目背景图像 UIBarButtonItem 外观代理的 setBackgroundImage forState
  • 如何使用自定义的ClassLoader?

    大家好 感谢您的关注 我有一个必须既简单又明显的问题 但我却陷入困境 我想通过自定义类加载器提供动态创建的 Java 类 供第三方库使用 现在我的问题是 当我自己不直接加载这些类时 如何设置自定义类加载器来加载这些类 我想当我使用我的Cla