java.nio.Buffer 未在运行时加载 clear() 方法
Posted
技术标签:
【中文标题】java.nio.Buffer 未在运行时加载 clear() 方法【英文标题】:java.nio.Buffer not loading clear() method on runtime [duplicate] 【发布时间】:2018-02-08 19:52:04 【问题描述】:所以我是一个使用 java 代理注入的项目的开发人员。需要注意的是,这个错误发生在 main 调用之后。
对于大多数用户来说一切都很好,但有些用户遇到了 java.nio.IntBuffer 没有加载 clear()(继承自 Buffer)的问题
错误:
java.lang.NoSuchMethodError: java.nio.IntBuffer.clear()Ljava/nio/IntBuffer;
然后在我们的代码中调用了第一次 clear() 的堆栈跟踪。
这是什么原因(除了 Java 在运行时没有加载),我该如何解决?
【问题讨论】:
检查这个comment。 Java9 似乎改变了 Buffer 的一些方法签名。 【参考方案1】:感谢 Janez Kuhar 的评论并进行了一些挖掘,这是由 JDK9 破坏兼容性引起的。在我们的代码中,我们调用 IntBuffer.clear() 并期望它返回 Buffer,但在 JDK9 中,它们使所有 Buffer 方法都返回子类型(即 ByteBuffer 或 IntBuffer 而不仅仅是 Buffer),因此运行 JRE8 的人(我们的大多数用户群) 遇到 NoSuchMethodError 的因为返回类型不兼容,必须像这样强制转换
someMethod(((Buffer)intBuffer).clear());
【讨论】:
不必强制转换。刚重新编译。淘气的甲骨文。 当你想兼容 Java 8 时,只需使用--release
选项。【参考方案2】:
这里是 NoSuchMethodError 的一个很好的解释。
https://www.codenong.com/js8f219d981aa9/
注意:flip() 方法也有这个问题。
如果您使用 jdk9+ 编译并在 jdk8 上运行,则需要强制转换。 在我的项目中,我为这个问题创建了 2 个实用方法:
public static void clear(Buffer buffer)
buffer.clear();
public static void flip(Buffer buffer)
buffer.flip();
【讨论】:
以上是关于java.nio.Buffer 未在运行时加载 clear() 方法的主要内容,如果未能解决你的问题,请参考以下文章