NoSuchMethodError с JSON-Lib и JDK 1.4 - PullRequest
       7

NoSuchMethodError с JSON-Lib и JDK 1.4

3 голосов
/ 03 августа 2011

Я скачал предположительно последний совместимый с JDK 1.3 двоичный файл с именем json-lib-2.4-jdk13.jar и получаю следующую ошибку.

Exception in thread "main" java.lang.NoSuchMethodError: java.lang.ThreadLocal: method remove()V not found
    at net.sf.json.AbstractJSON.removeInstance(AbstractJSON.java:221)

Я проверил API JDK 1.4 и заметил, чтометод в ThreadLocal действительно не поддерживается и добавляется только в JDK 1.5

Код, вызывающий беспокойство:

protected static void removeInstance(Object instance)
{
  Set set = getCycleSet();
  set.remove(instance);
  if (set.size() == 0)
    cycleSet.remove();
}

Кто-нибудь знает, пропустил ли я что-то очевидное здесь, или мне нужно дополнительноескачать что ли?

Ответы [ 2 ]

3 голосов
/ 03 августа 2011

Set # remove (Object) определенно определено в Java 1.3 .Ошибка фактически говорит о том, что ThreadLocal # remove () V не существует.Это пришло в 1.5.(Видите? Нет такого метода! )

Вот источник ошибки в json-lib 2.4 (jdk1.3)

AbstractJSON:

   /**
    * Removes a reference for cycle detection check.
    */
   protected static void removeInstance( Object instance ) {
      Set set = getCycleSet();
      set.remove( instance );
      if(set.size() == 0) {
          cycleSet.remove();   // BUG @ "line 221"
      }
   }

Так как в CycleSet.java мы видим:

   private static class CycleSet extends ThreadLocal {
      protected Object initialValue() {
         return new SoftReference(new HashSet());
      }

      public Set getSet() {
         Set set = (Set) ((SoftReference)get()).get();
         if( set == null ) {
             set = new HashSet();
             set(new SoftReference(set));
         }
         return set;
      }
   }

Но ThreadLocal (1.3) не имеет такого метода.

[править после @AlexR ответ / комментарий]:

Учитывая, что библиотека с открытым исходным кодом, я думаю, что это может исправить (не проверено):

   private static class CycleSet extends ThreadLocal {
      protected Object initialValue() {
         return new SoftReference(new HashSet());
      }
      /** added to support JRE 1.3 */
      public void remove() {
          this.set(null);
      }
      public Set getSet() {
         Set set = (Set) ((SoftReference)get()).get();
         if( set == null ) {
             set = new HashSet();
             set(new SoftReference(set));
         }
         return set;
      }
   }
0 голосов
/ 03 августа 2011

Я только что проверил код Thread и ThreadLocal.Я думаю, что если вы хотя бы можете контролировать командную строку, которую используете для запуска приложения, вы можете попытаться создать специальную версию Thread, которая является слиянием Thread с Java 1.3 с Thread от Java 1.5: добавить локальную поддержку потока.

Затем немного исправьте сам ThreadLocal: удалите дженерики и AtomicInteger, когда-то использовавшийся там.

Теперь создайте jar, который создает эти 2 класса, и поместите их в путь начальной загрузки при запуске приложения.

И много удачи.Если вам повезет, это, вероятно, сработает.

...