我不是一个经验丰富的程序员,对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
。