jdk8中如果直接调用MethodHandles.lookup()获取到的MethodHandles.Lookup
在调用方法 MethodHandles.Lookup#findSpecial(java.lang.Class, java.lang.String, java.lang.invoke.MethodType, java.lang.Class)
和MethodHandles.Lookup#unreflectSpecial(java.lang.reflect.Method, java.lang.Class)
获取父类方法句柄MethodHandle时
可能出现权限不够, 抛出如下异常, 所以通过反射创建MethodHandles.Lookup解决该问题.
java.lang.IllegalAccessException: no private access for invokespecial: interface com.example.demo.methodhandle.UserService, from com.example.demo.methodhandle.UserServiceInvoke
at java.lang.invoke.MemberName.makeAccessException(MemberName.java:850)
at java.lang.invoke.MethodHandles$Lookup.checkSpecialCaller(MethodHandles.java:1572)
而jdk11中直接调用MethodHandles.lookup()获取到的MethodHandles.Lookup,也只能对接口类型才会权限获取方法的方法句柄MethodHandle.
如果是普通类型Class,需要使用jdk9开始提供的 MethodHandles#privateLookupIn(java.lang.Class, java.lang.invoke.MethodHandles.Lookup)方法.
参考文章