3

我已经下载了名为 json-lib-2.4-jdk13.jar 的所谓最新的 JDK 1.3 兼容二进制文件,但出现以下错误。

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

我检查了 JDK 1.4 API 并注意到 ThreadLocal 上的 remove 方法确实不受支持,并且仅在 JDK 1.5 中添加

违规代码是:

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

有谁知道我是否在这里遗漏了一些明显的东西,或者需要额外下载什么的?

4

2 回答 2

3

Set#remove(Object) 肯定是在 Java 1.3 中定义的。该错误实际上是说 ThreadLocal#remove()V 不存在。那是在 1.5 中出现的。(看到了吗?没有这种方法!

这是 json-lib 2.4 (jdk1.3) 中的错误来源

抽象JSON:

   /**
    * 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;
      }
   }
于 2011-08-03T15:45:59.550 回答
0

我刚刚检查了 Thread 和 ThreadLocal 的代码。我认为,如果您至少可以控制用于运行应用程序的命令行,则可以尝试创建特殊版本的 Thread,它是 java 1.3 中的 Thread 与 java 1.5 中的 Thread 的合并:添加线程本地支持。

然后修复一点 ThreadLocal 本身:删除曾经使用过的泛型和 AtomicInteger。

现在创建创建这 2 个类的 jar,并在运行应用程序时将它们放入引导类路径。

还有很多好运。如果你幸运的话,这可能会奏效。

于 2011-08-03T15:48:06.847 回答