class Test(在未命名的模块@0x33f88ab中)无法访问class com.sun.media.sound.



我想使用musig来分析音频指纹
但我在音乐库中出现以下错误。

IllegalAccessError: class Test
(in unnamed module @0x33f88ab) cannot access class com.sun.media.sound.FFT
(in module java.desktop)
because module java.desktop does not export com.sun.media.sound to unnamed module @0x33f88ab

我该怎么办?

环境

  • Kotlin
  • JDK 17(可降级(
  • 音乐g 1.4.2.2

我的代码

fun main(args: Array<String>) {
FFT(10, 20)
}

FFT(10, 20)中获得异常

com.sun及其子包不是公共Java API的一部分。它们实现了一些标准的Java API,但您不应该直接引用它们。(它们可能会在JVM发布之间更改和/或重命名或删除,而非Sun/Oracle JVM可能根本没有它们。(

在大多数情况下,您应该访问公共API类(例如javax.sound(。(根据需要,这些可以在内部使用sun.*/com.sun.*/等类,但这只是一个实现细节。(

在Java的早期版本中,没有什么可以阻止人们使用这些内部实现类,因此一些开发人员养成了坏习惯。但Java9添加了一个模块系统,限制了对它们的访问。您看到的错误消息就是这样的结果。

详情见JEP 260。其目的是为所有受到限制的关键API提供公共API。然而,根据这个Oracle论坛页面,这项工作还没有完成,因此有一些内部API还没有公开的等效API。

FFT看起来像是那些被忽视的类之一。恐怕我找不到直接的替代品。有可以使用的第三方库吗?这个问题提供了一些选择。

最新更新