gpt4 book ai didi

java - 我自己的类加载器?

转载 作者:行者123 更新时间:2023-11-30 06:39:43 25 4
gpt4 key购买 nike

这是我遇到的问题。有一个巨大的遗留应用程序在 java 1.3 上运行并使用外部 API,比如 MyAPI v1.0。 MyAPI 1.0 的确切实现位于应用程序使用的类路径中的某处。还有一种机制允许该应用程序使用外部代码(某种插件机制)。现在我有另一个使用 MyAPI v2.0(不是 100% 向后兼容 v1.0)的 java 库 (MyLib.jar),我必须使用该插件机制从原始应用程序中使用它。所以我必须以某种方式让同一个 API 的两个(不兼容!)版本一起工作。具体来说,我想在从 MyLib.jar 类调用 API 类时使用 MyAPI v2.0,而在所有其他情况下使用 MyAPI 1.0。

MyAPI 1.0 在类路径中,所以默认使用它,没关系。我可以创建自己的类加载器版本来从 MyAPI 2.0 加载类——没问题。但是我如何将它们组合在一起呢?问题:

  1. MyLib.jar 对象实例化了大量(!)MyAPI 2.0 类的实例。这是否意味着我必须通过反射(指定我自己的类加载器)来完成所有这些实例化?这真是一项了不起的工作!

  2. 如果一些 MyAPI 2.0 对象被实例化,并且它在内部实例化另一个来自 MyAPI 的对象,它将使用什么类加载器?它会使用我的类加载器还是默认的类加载器?

  3. 一般来说,我的方法听起来合理吗?有没有更好的办法?

最佳答案

让我们从回答您的第二个问题开始:当从某个类引用到另一个类时,它将由加载原始类的同一个类加载器加载(当然除非类加载器没有成功找到该类,然后它将委托(delegate)给它的父类加载器)。

话虽如此,为什么您的整个 MyLib.jar 不由自定义类加载器加载,然后它可以以常规方式引用较新版本的 API。否则你就会遇到问题,因为你必须一直使用对象类型和反射。

关于java - 我自己的类加载器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/515702/

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