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();
}
所以我是一个使用 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();
}