我有任何方法来覆盖Java中的系统属性吗?

时间:2009-05-26 07:22:39

标签: java casting jvm runtime

我遇到了一个实际问题,问题可以解释如下。

当使用他们提供的API在外部CMS中触发事件时,我们正在开发一个组件(Say a plugin)来执行某项任务。他们提供了一些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)。但是HttpsURLConnection从com.sun.net.ssl迁移到javax.net.ssl 1.4。但似乎我所指的CMS(我们实际上并不知道它们的实现)使用类似这样的东西

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

在我们的代码中导致ClassCastException。

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

-Djava.protocol.handler.pkgs=

我们也无法使用

重新设置它
System.setProperty("")

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

我可以做些什么才能解决此问题?和想法或经验?

3 个答案:

答案 0 :(得分:2)

这对我来说并不清楚。

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

在调用外部库方法之前覆盖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? 为什么你不能手动设置系统属性?

答案 1 :(得分:1)

我认为使用不同的属性获得两段代码并不会有太大的成功。

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

请参阅http://java.sun.com/developer/onlineTraining/protocolhandlers/

答案 2 :(得分:0)

  1. 在堆栈跟踪中找到有问题的类
  2. 使用jad或类似工具对其进行反编译。
  3. 修复属性名称
  4. 编译生成的文件,并替换CMS jar中的.class文件,或将其放入类路径中较早的位置。
  5. 使用ant自动执行此过程(好吧,JAR的编译和构建;而不是反编译)
  6. 当它工作时,请确保将所有内容(原始文件,更改的文件,构建文件)保存到某处,以便您可以轻松地再次执行此操作。
  7. 虽然这可能听起来像是解决问题的荒谬或危险方式,但它会起作用。特别是因为您的CMS提供商似乎没有积极开发他的产品。