【问题标题】:tried to recompile oldest java software试图重新编译最旧的 java 软件
【发布时间】:2021-05-21 08:39:39
【问题描述】:

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

我有一个用 java1.5 编译的 10 年前的小型 java 软件。显然我没有源代码。 这个软件有一个小bug,所以我用了一个java反编译器,发现了这个bug。 解决方案非常简单,但我在重新编译类时遇到了困难。我正在使用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 decompiler rebuild recompile


    【解决方案1】:

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

    另外,不同的反编译器产生不同的结果:Eclipse Enhanced Class Decompiler 使用多种类型的反编译器。

    对于您的错误:

    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&lt;E, Object&gt;。并且泛型类型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&lt;String, ?&gt;

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

    简单:使用Byte 而不是byte

    【讨论】:

    • 这是一个无类型地图(Map removedEntries)。您将不得不推断类型,或使用原始类型(例如:示例中的迭代器)。仅当存在显式强制转换时,您才可以推断类型(因为这会产生 CCE)。从您的代码中,很难判断所说的类型可能是什么......
    • 是的,这是一张地图:public void deleteEntries(Map removedEntries)
    • 你认为我的另一个反编译器可以获得更好的代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多