diff --git a/src/main/java/org/apache/ibatis/binding/MapperProxy.java b/src/main/java/org/apache/ibatis/binding/MapperProxy.java index 4364fa167f1..5577ad5e501 100644 --- a/src/main/java/org/apache/ibatis/binding/MapperProxy.java +++ b/src/main/java/org/apache/ibatis/binding/MapperProxy.java @@ -17,6 +17,7 @@ import java.io.Serializable; import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodHandles.Lookup; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; @@ -32,6 +33,9 @@ public class MapperProxy implements InvocationHandler, Serializable { private static final long serialVersionUID = -6424540398559729838L; + private static final int ALLOWED_MODES = MethodHandles.Lookup.PRIVATE | MethodHandles.Lookup.PROTECTED + | MethodHandles.Lookup.PACKAGE | MethodHandles.Lookup.PUBLIC; + private static Constructor lookupConstructor; private final SqlSession sqlSession; private final Class mapperInterface; private final Map methodCache; @@ -42,6 +46,20 @@ public MapperProxy(SqlSession sqlSession, Class mapperInterface, Map constructor = MethodHandles.Lookup.class - .getDeclaredConstructor(Class.class, int.class); - if (!constructor.isAccessible()) { - constructor.setAccessible(true); - } final Class declaringClass = method.getDeclaringClass(); - return constructor - .newInstance(declaringClass, - MethodHandles.Lookup.PRIVATE | MethodHandles.Lookup.PROTECTED - | MethodHandles.Lookup.PACKAGE | MethodHandles.Lookup.PUBLIC) - .unreflectSpecial(method, declaringClass).bindTo(proxy).invokeWithArguments(args); + final Lookup lookup; + if (lookupConstructor.getParameterCount() == 2) { + lookup = lookupConstructor.newInstance(declaringClass, ALLOWED_MODES); + } else { + // SInce JDK 14+8 + lookup = lookupConstructor.newInstance(declaringClass, null, ALLOWED_MODES); + } + return lookup.unreflectSpecial(method, declaringClass).bindTo(proxy).invokeWithArguments(args); } }