当前位置: 首页 > 知识库问答 >
问题:

我可以先占班级路径吗?[重复]

龙令雪
2023-03-14

我有一个库,它是一个商业产品的直接扩展。那个产品已经有几年的历史了,并且使用Sun的JAXB-2.0库。

我的库使用JAXB,我遇到了一个非常奇怪的错误。什么可能导致“JAXBElement没有no-arg默认构造函数”?

我发现这是由旧库中的错误引起的。我是否可以抢占已加载的类以强制我的扩展使用该类的“正确”版本?

编辑:和我的插件一起,我打包了JAXB-2.2.5(在我的插件的类路径中引用了它),但是我怀疑现有的JVM已经加载了该类的2.0版本,这让我很心痛。

共有1个答案

牧甫
2023-03-14

每个 Java 都由一个类加载器装入。一旦装入了类,就不可能从类装入器中卸载该类。摆脱类的唯一可能性是丢失对此类装入器已装入的所有类实例的所有引用以及对类装入器本身的引用。

类装入器按层次结构进行组织。缺省情况下,每个类装入器首先要求其父类装入器装入一个类。仅当父类装入器无法装入类时,原始类装入器才会尝试装入。您可以重写此行为以装入 JAXB 类。

但是这并不容易:假设您有一个用类装入器a装入的类< code>MyObject,如果您用类装入器B装入同一个类,那么< code>MyObject.class!= MyObject.class,用于两个类。这还会导致< code > my object o = getMyObjectFromOtherClassLoader()引发< code>ClassCastException。

Stackoverflow提供了一个一级子装入器的示例。剩下的唯一事情就是在类加载器激活之前,在不加载类的情况下运行应用程序。这样,您可以执行以下操作(未验证的代码):

class StartupWrapper {

  public static void main(String[] args) throws Exception {
    Class.forName("com.company.Main", true, 
        new ParentLastURLClassLoader(Arrays.asList(new URL("./new-JAXB.jar"))))
      .getMethod("main", String[].class).invoke(null, args);
  }
}

这个包装器将启动您的普通应用程序的publicstaticvoidmain(String[])类的方法com.company。使用首先考虑库的子类装入器命名。确保您没有加载com.company。在显式加载之前执行Main。(因此是反思方法。)

您是否正在使用像 Maven 这样的构建工具?难道你不能明确地排除旧图书馆的依赖性吗?旧版应用程序在使用新 JAXB 时可能会遇到与旧 JAXB 类似的问题。

 类似资料:
  • 问题内容: 如果我将Class声明为字段: Eclipse给我警告: 类是原始类型。对泛型类型Class的引用应参数化 在实践中这意味着什么?我为什么要这样做呢?如果我要求Eclipse提供“快速修复”,它将给我: 这似乎并没有增加太多价值,但不再发出警告。 编辑:为什么类通用?您能否举一个参数化的例子,即可以有效使用除以外的东西吗? 编辑:哇!我还没有意识到这一点。我也看过Java拼图游戏,这肯

  • 问题内容: 我的班级应同时扩展两个班级: 怎么做? 更新 。由于这是不可能的,那么我该如何将那个AbstractBillingActivity和Preferences一起使用? Upd2 。如果我使用接口,我应该创建: 计费接口 } 偏好活动 } 抽象帐单活动 } 然后 问题答案: Java不支持多重继承。 我可以想到一些解决方法: 第一个是聚合:创建一个将这两个活动作为字段的类。 第二是使用接口

  • 在我的测试应用程序中,我有我的安全配置类,如下所示。 在那里我定义了encoder()并将其注释为@beans。这意味着该方法生成一个bean由spring容器管理。同样,我需要通过构造函数访问编码器,如下所示。 在上面的示例中,我使用密码编码器作为构造函数参数。问题是@Bean方法不是由调用RegistrationController的时间构造函数执行的。在将encoder()添加到bootst

  • 问题内容: 在Spring 3.0中,我可以有一个可选的path变量吗? 例如 在这里我想还是要调用相同的方法。 一种明显的解决方法是声明为请求参数: 然后/json?type=abc&track=aa或/json?track=rr将工作 问题答案: 你不能具有可选的路径变量,但是可以有两个调用相同服务代码的控制器方法:

  • 在Eclipse 4.2中,是否有方法显示Ant视图中包含的Ant构建文件的路径或项目名称信息? 在我的工作区中,我当前签出了两个版本的项目,一个来自我们的myproject/trunk,另一个来自myproject/Branchs/feature 从每个分支中,我已经将适当的build.xml从项目中拖到蚂蚁视图中。但是,由于主干和功能分支都有相同的项目名称和相同的目标,因此在蚂蚁视图中无法区分

  • 我可以使用PHP以编程方式更改文件的路径吗? 例如,更改