猿问

找不到方法 sun.misc.Unsafe.defineClass

我正在使用jdk-10.0.2and gradle 4.7,在构建我的项目时出现此错误。

    Unable to find method 'sun.misc.Unsafe.defineClass(Ljava/lang/String;[BIILjava/lang/ClassLoader;Ljava/security/ProtectionDomain;)Ljava/lang/Class;'.Possible causes for this unexpected error include:Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
Re-download dependencies and sync project (requires network)

The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem.
Stop Gradle build processes (requires restart)

Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.

In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.



慕斯王
浏览 982回答 5
5回答

守着星空守着你

我有同样的问题(但使用JDK 11):找不到方法 'sun.misc.Unsafe.defineClass(Ljava/lang/String;[BIILjava/lang/ClassLoader;Ljava/security/ProtectionDomain;)Ljava/lang/Class;'。和你一样的版本gradle 4.7。我的gradle-wrapper.properties文件是:    distributionBase=GRADLE_USER_HOME    distributionPath=wrapper/dists    zipStoreBase=GRADLE_USER_HOME    zipStorePath=wrapper/dists    distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-all.zip为了解决这个问题,我使用参数更改为 4.9 版本的包装器distributionUrl: distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-all.zip并在没有任何错误的情况下重建项目。

POPMUISE

在jdk 9 中sun.misc.Unsafe.defineClass已被替换为,在 jdk 11 中完全删除。java.lang.invoke.MethodHandles.Lookup.defineClasssun.misc.Unsafe.defineClass参考:https ://docs.oracle.com/javase/9/docs/api/java/lang/invoke/MethodHandles.Lookup.html#defineClass-byte:A-

汪汪一只猫

由于 Java 后期版本的 sun.misc.Unsafe 中删除了 defineClass 方法,所以我们需要在内部 Unsafe 中调用该方法。由于默认情况下整个包是隐藏的,我们需要反射地调用所有内容。此代码从 java 17 开始工作try {&nbsp; &nbsp; Field f = Unsafe.class.getDeclaredField("theUnsafe"),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f1 = Unsafe.class.getDeclaredField("theUnsafe");&nbsp; &nbsp; f.setAccessible(true);&nbsp; &nbsp; f1.setAccessible(false);&nbsp; &nbsp; Unsafe unsafe = (Unsafe) f.get(null);&nbsp; &nbsp; int i;//override boolean byte offset. should result in 12 for java 17&nbsp; &nbsp; for (i = 0; unsafe.getBoolean(f, i) == unsafe.getBoolean(f1, i); i++);&nbsp; &nbsp; Field f2 = Unsafe.class.getDeclaredField("theInternalUnsafe");&nbsp; &nbsp; unsafe.putBoolean(f2, i, true);//write directly into override to bypass perms&nbsp; &nbsp; Object internalUnsafe = f2.get(null);&nbsp; &nbsp; Method defineClass = internalUnsafe.getClass().getDeclaredMethod("defineClass",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String.class, byte[].class, int.class, int.class,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ClassLoader.class, ProtectionDomain.class);&nbsp; &nbsp; unsafe.putBoolean(defineClass, i, true);&nbsp; &nbsp; Class<?> newClass = (Class<?>) defineClass.invoke(internalUnsafe,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; className, byteCode, offset, length,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Object.class.getClassLoader(), Object.class.getProtectionDomain());} catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {&nbsp; &nbsp; throw new RuntimeException(e);}我将逐步解释这是在做什么使用反射直接访问 sun.misc.Unsafe 实例。获取 sun Unsafe 字段的另一个副本,将其设置为不可访问严格地遍历这两个实例中的字节,直到发现差异。这是 AccessibleObject 类中的变量“覆盖”,字段和方法用于确定它们是否可访问。从 sun Unsafe 类中获取 internalUnsafe 字段,使用 sun Unsafe 实例将其设置为可访问(虽然我们可以获取字段对象,但 java 不会让我们将内部或反射包中的任何内容设置为可直接访问)获取 internalUnsafe 实例,将其保存到 Object 指针,因为我们不能直接引用 internal.misc.Unsafe从 internalUnsafe 反射性地获取 defineClass 方法使用与太阳相同的偏移量将方法设置为可访问不安全用我们的参数调用它希望只要 Unsafe 保留在 jdk 中,它就可以继续工作。

慕容3067478

您是否指定了此处提到的模块依赖项?从 JDK 9 开始,Unsafe API 似乎被隐藏了。因此,添加module&nbsp;jdk.unsupported&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;exports&nbsp;sun.misc; &nbsp;&nbsp;&nbsp;&nbsp;opens&nbsp;sun.misc; &nbsp;&nbsp;&nbsp;&nbsp;...}对您的项目可能会有所帮助。

鸿蒙传说

Gradle 中的 .gradle 文件中的依赖项存在问题。或 pom.xml 文件(如果您使用的是 Maven)。这可能有很多原因:版本冲突,或者两次声明相同依赖项的冲突。或者检查您添加到库中的 jar_file 版本。
随时随地看视频慕课网APP

相关分类

Java
我要回答