如何使用自定义的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? 的相关文章

  • 如何使用 Apache POI API 将图像添加到 pptx 中添加的图像占位符?

    我已经预定义了带有文本和图像占位符的 pptx 模板 我如何从模板访问和修改这些占位符 我可以使用 POI pptx API 直接将图像和文本添加到幻灯片中 但如何将其添加到模板的占位符中 请参阅链接以了解如何添加占位符来创建固定模板 ht
  • Java - 为什么不允许 Enum 作为注释成员?

    It says 原始 String Class an Enum 另一个注释 上述任何一个的数组 只有这些类型才是合法的 Annotation 成员 为什么泛型 Enum 不能成为 Annotation 的成员 例如 Retention Re
  • 如何创建一个显示 Spinners 的 x 和 y 值的表格?

    我想创建一个位于图表右侧的表格 其中显示 2 列 x 和 y 值已输入到xSpin and ySpin旋转器 我已经画了一张我想要桌子放置的位置的图 我尝试过在网格窗格布局中使用文本框来创建表格并将值直接输入到文本框网格中 但是我无法将它们
  • org.apache.sling.api.resource,version=[2.3,3) -- 无法解析

    您好 我无法访问我的项目内容 我已经上传了从 CQ 访问内容所需的所有包 我唯一能看到的是 org apache sling api resource version 2 3 3 无法解析 这是否是异常的原因 如果是 请告诉我如何解决 中Q
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • Android在排序列表时忽略大小写

    我有一个名为路径的列表 我目前正在使用以下代码对字符串进行排序 java util Collections sort path 这工作正常 它对我的 列表进行排序 但是它以不同的方式处理第一个字母的情况 即它用大写字母对列表进行排序 然后用
  • wait() 在游戏中如何工作?

    在 playframework 的文档中here http www playframework org documentation 1 2 1 asynchronous已写 public static void loopWithoutBlo
  • 按第一列排序二维数组,然后按第二列排序

    int arrs 1 100 11 22 1 11 2 12 Arrays sort arrs a b gt a 0 b 0 上面的数组已排序为 1 100 1 11 2 12 11 22 我希望它们按以下方式排序a 0 b 0 首先 如果
  • 如何模拟从抽象类继承的受保护子类方法?

    如何使用 Mockito 或 PowerMock 模拟由子类实现但从抽象超类继承的受保护方法 换句话说 我想在模拟 doSomethingElse 的同时测试 doSomething 方法 抽象超类 public abstract clas
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • 具有 java XSLT 扩展的数组

    我正在尝试使用 java 在 XSLT 扩展中使用数组 我收到以下错误 Caused by java lang ClassCastException org apache xpath objects XObject cannot be ca
  • 如何在selenium服务器上提供自定义功能?

    我知道可以通过某种方法获得一些硒功能 其中之一如下 driver getCapabilities getBrowserName 它返回浏览器名称的值 但如果它指的是一个可用的方法 如果我没有误解的话 这似乎与自定义功能有关 就像我的意思是
  • IntelliJ - 调试模式 - 在程序内存中搜索文本

    我正在与无证的第三方库合作 我知道有一定的String存储在库深处的某个字段中的某处 我可以预测的动态值 但我想从库的 API 中获取它 有没有一种方法可以通过以下方式进行搜索 类似于全文搜索 full程序内存处于调试模式并在某个断点处停止
  • java.lang.NumberFormatException: Invalid int: "3546504756",这个错误是什么意思?

    我正在创建一个 Android 应用程序 并且正在从文本文件中读取一些坐标 我在用着Integer parseInt xCoordinateStringFromFile 将 X 坐标转换为整数 Y 坐标的转换方法相同 当我运行该应用程序时
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • hashcode 的默认实现为以相同方式构造的对象返回不同的值

    我在这里编写一个示例代码 public class Test private int i private int j public Test TODO Auto generated constructor stub public Test
  • ServletContainer 类未找到异常

    我无法再编译我的球衣项目 并且出现以下异常 GRAVE Servlet Project API threw load exception java lang ClassNotFoundException com sun jersey spi
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • 带有 Maven Wrapper 的 Java 17 导致无法识别的 VM 选项“MaxPermSize=512m”

    I use OpenJDK 17 https jdk java net 17 使用 Maven Wrapper 3 8 2 从春季初始化 https start spring io Maven项目 JAR打包 Java 17 Spring

随机推荐

  • “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