我遇到了一个实际问题,问题可以解释如下。
当使用他们提供的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实例相同。
我可以做些什么才能解决此问题?和想法或经验?
答案 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)