java.nio.Buffer 未在运行时加载 clear() 方法

java.nio.Buffer not loading clear() method on runtime

所以我是一个使用 java 代理注入的项目的开发人员。需要注意的是,这个错误发生在main调用之后。

大多数用户一切正常,但有少数用户遇到问题,即 java.nio.IntBuffer 未加载 clear()(继承自 Buffer)

错误:

java.lang.NoSuchMethodError: java.nio.IntBuffer.clear()Ljava/nio/IntBuffer;

然后是堆栈跟踪,它简单地给出了我们代码中第一次调用 clear() 的时间。

这是什么原因(除了 Java 未在运行时加载这一事实之外)以及如何解决它?

感谢 Janez Kuhar 的评论并进行了一些挖掘,这是由 JDK9 破坏兼容性造成的。在我们的代码中,我们调用 IntBuffer.clear() 并期望它成为 return Buffer,但在 JDK9 中,他们将所有 Buffer 方法设为 return 子类型(即 ByteBuffer 或 IntBuffer,而不仅仅是 Buffer) ,因此人们 运行 JRE8(我们的大部分用户群)会遇到 NoSuchMethodError,因为 return 类型不兼容,必须像这样转换

someMethod(((Buffer)intBuffer).clear());

这是对 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();
  }