From af09bc536b9782759adecf39e7190c62231badc6 Mon Sep 17 00:00:00 2001 From: Luna Date: Wed, 28 Jul 2021 20:06:11 -0700 Subject: [PATCH 1/2] JDK16 compatibility --- build.gradle.kts | 2 +- gradle.properties | 6 +++ .../internal/util/DefineClass.java | 2 +- .../internal/util/LookupAccess.java | 36 +++++++++++++++ .../internal/util/UnsafeAccess.java | 23 ---------- .../internal/util/ImplLookupTest.java | 46 ------------------- 6 files changed, 44 insertions(+), 71 deletions(-) create mode 100644 gradle.properties create mode 100644 src/main/java/dev/minco/javatransformer/internal/util/LookupAccess.java delete mode 100644 src/main/java/dev/minco/javatransformer/internal/util/UnsafeAccess.java delete mode 100644 src/test/java/dev/minco/javatransformer/internal/util/ImplLookupTest.java diff --git a/build.gradle.kts b/build.gradle.kts index edd2b29..7df43f4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ plugins { id("java") id("java-library") id("maven-publish") - id("dev.minco.gradle.defaults-plugin") version "0.2.8" + id("dev.minco.gradle.defaults-plugin") version "0.2.26" id("org.shipkit.shipkit-auto-version") version "1.1.1" id("org.shipkit.shipkit-changelog") version "1.1.4" id("org.shipkit.shipkit-github-release") version "1.1.4" diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..ca1c0e7 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,6 @@ +# The exports are needed due to https://github.com/diffplug/spotless/issues/834 +org.gradle.jvmargs=--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \ + --add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \ + --add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED \ + --add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \ + --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED diff --git a/src/main/java/dev/minco/javatransformer/internal/util/DefineClass.java b/src/main/java/dev/minco/javatransformer/internal/util/DefineClass.java index a237f78..949b24f 100644 --- a/src/main/java/dev/minco/javatransformer/internal/util/DefineClass.java +++ b/src/main/java/dev/minco/javatransformer/internal/util/DefineClass.java @@ -10,7 +10,7 @@ import lombok.SneakyThrows; public final class DefineClass { - private static final MethodHandles.Lookup $L = UnsafeAccess.IMPL_LOOKUP; + private static final MethodHandles.Lookup $L = LookupAccess.privateLookupFor(ClassLoader.class); private static final ProtectionDomain PROTECTION_DOMAIN = AccessController.doPrivileged((PrivilegedAction) DefineClass.class::getProtectionDomain); private static final MethodHandle defineClassHandle = getDefineClassHandle(); diff --git a/src/main/java/dev/minco/javatransformer/internal/util/LookupAccess.java b/src/main/java/dev/minco/javatransformer/internal/util/LookupAccess.java new file mode 100644 index 0000000..4055da1 --- /dev/null +++ b/src/main/java/dev/minco/javatransformer/internal/util/LookupAccess.java @@ -0,0 +1,36 @@ +package dev.minco.javatransformer.internal.util; + +import java.lang.invoke.MethodHandles; + +import lombok.SneakyThrows; +import lombok.val; + +public class LookupAccess { + private static final MethodHandles.Lookup IMPL_LOOKUP; + + @SneakyThrows + public static MethodHandles.Lookup privateLookupFor(Class clazz) { + if (IMPL_LOOKUP != null) { + return IMPL_LOOKUP; + } + + MethodHandles.Lookup lookup = MethodHandles.lookup(); + + Object privateLookupIn = MethodHandles.class.getMethod("privateLookupIn", Class.class, MethodHandles.Lookup.class) + .invoke(null, clazz, lookup); + return (MethodHandles.Lookup) privateLookupIn; + } + + static { + MethodHandles.Lookup lookup = null; + try { + val field = MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP"); + field.setAccessible(true); + lookup = (MethodHandles.Lookup) field.get(null); + } catch (Throwable t) { + System.err.println("Failed to get MethodHandles.Lookup.IMPL_LOOKUP"); + t.printStackTrace(); + } + IMPL_LOOKUP = lookup; + } +} diff --git a/src/main/java/dev/minco/javatransformer/internal/util/UnsafeAccess.java b/src/main/java/dev/minco/javatransformer/internal/util/UnsafeAccess.java deleted file mode 100644 index 20f7f47..0000000 --- a/src/main/java/dev/minco/javatransformer/internal/util/UnsafeAccess.java +++ /dev/null @@ -1,23 +0,0 @@ -package dev.minco.javatransformer.internal.util; - -import java.lang.invoke.MethodHandles; - -import lombok.val; - -import com.github.javaparser.utils.Log; - -public class UnsafeAccess { - public static final MethodHandles.Lookup IMPL_LOOKUP; - - static { - MethodHandles.Lookup lookup = MethodHandles.lookup(); - try { - val field = MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP"); - field.setAccessible(true); - lookup = (MethodHandles.Lookup) field.get(null); - } catch (Throwable t) { - Log.error("Failed to get MethodHandles.Lookup.IMPL_LOOKUP", t); - } - IMPL_LOOKUP = lookup; - } -} diff --git a/src/test/java/dev/minco/javatransformer/internal/util/ImplLookupTest.java b/src/test/java/dev/minco/javatransformer/internal/util/ImplLookupTest.java deleted file mode 100644 index baffb1c..0000000 --- a/src/test/java/dev/minco/javatransformer/internal/util/ImplLookupTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package dev.minco.javatransformer.internal.util; - -import java.lang.invoke.MethodType; - -import lombok.SneakyThrows; -import lombok.val; - -import org.junit.Assert; -import org.junit.Test; - -public class ImplLookupTest { - private static String toString(Object o) { - return o.getClass().getName() + "@" + Integer.toHexString(o.hashCode()); - } - - @SneakyThrows - @Test - public void grandParentMethodCall() { - val lookup = UnsafeAccess.IMPL_LOOKUP; - val baseHandle = lookup.findSpecial(Base.class, "toString", - MethodType.methodType(String.class), - Sub.class); - val objectHandle = lookup.findSpecial(Object.class, "toString", - MethodType.methodType(String.class), - // Must use Base.class here for this reference to call Object's toString - Base.class); - val sub = new Sub(); - Assert.assertEquals("Sub", sub.toString()); - Assert.assertEquals("Base", baseHandle.invoke(sub)); - Assert.assertEquals(toString(sub), objectHandle.invoke(sub)); - } - - public class Sub extends Base { - @Override - public String toString() { - return "Sub"; - } - } - - public class Base { - @Override - public String toString() { - return "Base"; - } - } -} From c9d6198351c136661147dc22455e88e38de93489 Mon Sep 17 00:00:00 2001 From: Luna Date: Wed, 28 Jul 2021 20:06:42 -0700 Subject: [PATCH 2/2] Test on JDK16 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 23af609..cde9aec 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - jdk: [11, 15] + jdk: [11, 15, 16] steps: - uses: actions/checkout@v2 - uses: actions/cache@v2.1.4