【问题标题】:Do I have any method to override System Properties in Java?我有什么方法可以覆盖 Java 中的系统属性吗?
【发布时间】:2009-05-26 07:22:38
【问题描述】:

我遇到了一个实际问题,这个问题可以描述如下。

我们正在开发一个组件(比如一个插件),以便在使用它们提供的 API 在外部 CMS 中触发事件时执行某些任务。他们提供了一些jar库,所以我们正在做的是实现他们提供的接口。然后在触发事件时调用内部方法。 (CMS 在第一个事件触发时只创建一个类实例,然后它只执行每个事件触发的方法)

功能可以概括如下,

import com.external.ProvidedInterface;


public class MonitorProgram implements ProvidedInterface{

   public void process(){
      //This method is called when an event is triggered in CMS
   }

}

在我们的课程中,我们使用“javax.net.ssl.HttpsURLConnection”(JAVA 1.5)。但是 1.4 的 HttpsURLConnection 从 com.sun.net.ssl 迁移到了 javax.net.ssl。但似乎我所指的 CMS(我们实际上不知道他们的实现)使用了这样的东西

System.setProperty("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol");

在我们的代码中导致 ClassCastException。

我认为我的问题很明确。在我们的例子中,我们无法设置 VM 参数,

-Djava.protocol.handler.pkgs=

我们也不能使用,

System.setProperty("")

因为 CMS 和我们的程序的 VM 实例相同。

我可以做些什么来解决这个问题?以及想法或经验?

【问题讨论】:

  • 为什么不能使用 System.setProperty 和 -Djava.protocol.handler/pkgs ?你的问题不是很清楚......
  • 如果我使用 System.setProperty,那么属性将设置为 VM,从而导致 CMS(外部方)出现故障。我们只是将上述类保留在 CMS 安装中。我们不会手动执行它。 CMS会自动创建实例所以我们无法设置VM参数
  • 清除它:您在 CMS 中调用返回“HttpsURLConnection”的内容。但是,CMS 尝试从 com.sun.net.ssl.* 创建一些东西,而不是 javax.net.*。如果您强制 CMS 使用 javax.net.*,那么它将在 CMS 代码的深处抛出 ClassCastException。如果你不这样做,那么你的代码中有一个 ClassCastException。对吗?

标签: java casting jvm runtime


【解决方案1】:

这对我来说不是很清楚。

您要覆盖系统属性吗? 你可以这样做。

在调用外部库方法之前覆盖 System.property,当方法返回时,您可以将旧的 System.property 设置回来

    final String propertyName = "Property";
    String oldProperty = System.getProperty(propertyName);
    System.setProperty(propertyName,"NEW_VALUE");
    monitorProgram.process();
    System.setProperty(propertyName,oldProperty);

或者你想防止被调用的进程覆盖system.property? 为什么不能手动设置系统属性?

【讨论】:

  • 嗨,我在上面添加了一条评论,并对原始帖子进行了解释。
【解决方案2】:

我认为让两段代码使用不同的属性不会很成功。

但是,在您自己的代码中,您可以定义自己的 URLStreamHandlerFactory。这样做将允许您从 URL 创建 javax.net.ssl.HttpsURLConnection。虽然协议处理程序不是最容易弄清楚的,但我认为您可以让它们完成这项工作。

http://java.sun.com/developer/onlineTraining/protocolhandlers/

【讨论】:

    【解决方案3】:
    1. 在堆栈跟踪中找到有问题的类
    2. 使用jad或类似工具反编译。
    3. 修正属性名称
    4. 编译生成的文件并替换 CMS jar 中的 .class 文件或将其放入类路径中较早的位置。
    5. 使用ant 自动执行此过程(嗯,JAR 的编译和构建;而不是反编译)
    6. 当它工作时,请确保将所有内容(原始文件、更改的文件、构建文件)保存在某个位置,以便您可以轻松地再次执行此操作。

    虽然这听起来像是一种荒谬或危险的解决问题的方法,但它会奏效。特别是因为您的 CMS 提供商似乎并没有积极开发他的产品。

    【讨论】:

    • 我们无权更改 CMS 提供的档案。即使我们没有释放它们。获取这些 Jar 文件是客户的责任
    • 提交一份错误报告要求他们解决这个问题怎么样?
    猜你喜欢
    • 2014-10-02
    • 2015-12-10
    • 2013-03-18
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    相关资源
    最近更新 更多