【发布时间】:2015-12-31 13:01:11
【问题描述】:
这是一个非常特殊的案例,似乎是 .class 文件损坏。我们的应用程序依赖于其他团队提供的依赖项。有 2 个相关的 java 文件:FTGService 和 FTGServiceLight implements FTGService。
所以当我执行javap -p FTGService 时,它会打印:
....
public abstract java.util.List<munshi.transfers.domain.TransferredFile> getArchivedFilesByLastSyncTime(java.util.Date, java.util.Date, java.util.Date, java.util.Date, java.util.Date, java.util.List<java.lang.String>, java.util.List<java.lang.Integer>);
在执行javap -p FTGServiceLight 时,它会打印:
....
public java.util.List<munshi.transfers.domain.TransferredFile> getArchivedFilesByLastSyncTime(java.util.Date, java.util.Date, java.util.Date, java.util.Date, java.util.Date, java.util.List<java.lang.String>, java.util.List<java.lang.Integer>);
....
当我做javap -v FTGServiceLight时,可以在here找到相关信息。
但是运行时会报错:
java.lang.AbstractMethodError: munshi.transfers.service.light.FTGServiceLight.getArchivedFilesByLastSyncTime(Ljava/util/Date;Ljava/util/Date;Ljava/util/Date;Ljava/util/Date;Ljava/util/Date;Ljava/util/List;Ljava/实用程序/列表;)Ljava/实用程序/列表; 在 broker.services.resolver.impl.FileSyncServiceImpl.fetchFiles(FileSyncServiceImpl.java:71) 在 broker.services.resolver.impl.TransferFileSync.run(TransferFileSync.java:71) 在 sun.reflect.GeneratedMethodAccessor129.invoke(Unknown Source) at
getArchivedFilesByLastSyncTime 出于某种原因被标记为abstract。此外,当我调试它时,这就是它所显示的:
FTGServiceLight.getMethod("getArchivedFilesByLastSyncTime",Date.class,Date.class,Date.class,Date.class,Date.class, List.class, List.class))
注意modifiers 显示为1025,执行Modifiers.isAbstract(1025) 返回true。因此,调试方法getArchivedFilesByLastSyncTime 显示为abstract,但javap 建议采用其他方式。但是当我反编译FTGServiceLight时,确实显示了body的方法,所以好像被覆盖了。
什么可能导致这种行为
PS:我已经检查了 mvn 依赖树,并且这个类的替代版本从未出现过。
【问题讨论】:
-
也许你有多个版本的类,Javap看到的和JVM看到的不同。
-
如后期脚本中所述。只有一个依赖项。