Есть ли у меня какой-либо метод для переопределения системных свойств в Java? - PullRequest
0 голосов
/ 26 мая 2009

У меня возникает практическая проблема, и проблему можно описать следующим образом.

Мы разрабатываем компонент (например, плагин) для выполнения некоторой задачи, когда событие запускается во внешней CMS с использованием предоставляемого ими API. Они предоставили несколько библиотек 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 мигрировал в javax.net.ssl ​​из com.sun.net.ssl ​​для 1.4. Но, похоже, CMS, на которую я ссылаюсь (на самом деле мы не знаем об их реализации), использует что-то вроде этого

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

приводит к исключению ClassCastException в нашем коде.

Я думаю, мой вопрос ясен. В нашем случае мы не можем установить параметры виртуальной машины,

-Djava.protocol.handler.pkgs=

Также мы не можем установить его обратно, используя

System.setProperty("")

потому что экземпляр VM одинаков для CMS и нашей программы.

Что я могу сделать, чтобы решить эту проблему? А идея или опыт?

Ответы [ 3 ]

2 голосов
/ 26 мая 2009

Это мне не понятно.

Хотите перезаписать системное свойство? Вы можете сделать это.

Перезапишите свойство 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 голос
/ 26 мая 2009

Я не думаю, что вы добьетесь большого успеха, получив два куска кода для использования разных свойств.

Однако в своем собственном коде вы можете определить свой собственный URLStreamHandlerFactory. Это позволит вам создать соединение javax.net.ssl.HttpsURLC из URL. Хотя обработчики протоколов - не самая простая вещь, я думаю, вы можете заставить их выполнять свою работу.

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

0 голосов
/ 26 мая 2009
  1. Найти класс-нарушитель в трассировке стека
  2. Используйте jad или аналогичный инструмент для декомпиляции.
  3. Исправьте название объекта
  4. Скомпилируйте полученный файл и замените файл .class в банке CMS или поместите его в место, которое находится ранее в пути к классам.
  5. Используйте ant для автоматизации этого процесса (ну, компиляция и сборка JAR; не декомпиляция)
  6. Когда это сработает, обязательно сохраните все (исходный файл, измененный файл, файл сборки) где-нибудь, чтобы вы могли легко сделать это снова.

Хотя это может звучать как нелепый или опасный способ решения проблемы, оно будет работать. Тем более что ваш поставщик CMS, похоже, не разрабатывает свой продукт активно.

...