试图重新编译最古老的java软件



我不是一个经验丰富的程序员,对java知之甚少。

我有一个10年前用java1.5编译的小型java软件。显然我没有源代码。这个软件有一个小错误,所以我使用了java反编译器,发现了这个错误。解决方案非常简单,但我在重新编译类时遇到了困难。我正在使用java1.5.0_12进行重新编译。

不幸的是,编译器似乎在代码中遇到了一些错误。

it/cp/pacm/dbsync/Synchronizer.java:234: possible loss of precision
found   : int
required: char
/*  287 */       c = Integer.parseInt(strLdapPort);

代码是

/*      */     char c;
...
/*  287 */       c = Integer.parseInt(strLdapPort);

我用铸造的方法解决了这个问题。

/*  287 */       c = (char)Integer.parseInt(strLdapPort);

但是还有一个问题我无法解决

# javac -cp ../software.jar it/cp/pacm/dbsync/Synchronizer.java

software.jar是全包

it/cp/pacm/dbsync/Synchronizer.java:415: cannot find symbol
symbol  : class E
location: class it.cp.pacm.dbsync.Synchronizer
/*  497 */       for (Iterator<E> iterator = removedEntries.keySet().iterator(); iterator.hasNext(); ) {
^
it/cp/pacm/dbsync/Synchronizer.java:463: incompatible types
found   : java.util.Iterator<java.lang.Object>
required: java.util.Iterator<java.lang.String>
/*  552 */     for (Iterator<String> iterator1 = newAttributes.keySet().iterator(); iterator1.hasNext(); ) {
          ^
it/cp/pacm/dbsync/Synchronizer.java:475: incompatible types
found   : java.util.Iterator<java.lang.Object>
required: java.util.Iterator<java.lang.String>
/*  571 */     for (Iterator<String> i = oldAttributes.keySet().iterator(); i.hasNext(); ) {
  ^
it/cp/pacm/dbsync/Synchronizer.java:673: unexpected type
found   : byte
required: reference
/*  816 */     Arrays.sort(values, (Comparator<? super byte>)new ByteArrayComparator());
^
Note: it/cp/pacm/dbsync/Synchronizer.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
4 errors

我不知道E类是在哪里定义的。

有没有可以忽略这些错误的选项?

使用jdk1.5.0_11它没有开始构建:

Error occurred during initialization of VM
java/lang/NoClassDefFoundError: java/lang/Object

此外,该目录还包含一些其他未知的类文件

Synchronizer$DEFAULTS.class
Synchronizer$DNOrder.class
Synchronizer$EntryOrder.class
Synchronizer$SETTINGS.class
Synchronizer.class

谢谢

在尝试反编译/重新编译之前,您应该对Java有更多的了解:尤其是因为反编译器可能会在这个过程中失败,并生成看似有效但实际上无效的代码。它应该用于分析而不是修复现有代码。

此外,不同的反编译器会产生不同的结果:Eclipse增强类反编译器使用几种类型的反编译器。

对于您的错误:

it/cp/pacm/dbsync/Synchronizer.java:415: cannot find symbol
symbol  : class E
location: class it.cp.pacm.dbsync.Synchronizer
/*  497 */       for (Iterator<E> iterator = removedEntries.keySet().iterator(); iterator.hasNext(); ) {

这个错误涉及一个泛型类型E(给定名称;我从这里的源代码中推断不出太多(。

您应该查看removedEntries,我认为它是Map:反编译器可能将其保留为Map而不是Map<E, Object>。并且泛型类型E没有在父上下文(方法、类(中定义:

<E> void foobar(Map<E, ?> removedEntries) {
for (Iterator<E> iterator = removedEntries.keySet().iterator(); iterator.hasNext(); ) {
// ...
}
}

上面的代码可能会编译:声明了泛型类型E。

it/cp/pacm/dbsync/Synchronizer.java:463: incompatible types
found   : java.util.Iterator<java.lang.Object>
required: java.util.Iterator<java.lang.String>
/*  552 */     for (Iterator<String> iterator1 = newAttributes.keySet().iterator(); iterator1.hasNext(); ) {

同样的问题,不是同样的原因:你的反编译器可能无法在泛型类型中推断泛型的类型。例如:newAttributes可能被定义为Map,但它应该是Map<String, ?>

it/cp/pacm/dbsync/Synchronizer.java:673: unexpected type
found   : byte
required: reference
/*  816 */     Arrays.sort(values, (Comparator<? super byte>)new ByteArrayComparator());

简单:使用Byte而不是byte

相关内容

  • 没有找到相关文章

最新更新