package me.test.jdk.java.lang.invoke; import java.lang.invoke.CallSite; import java.lang.invoke.ConstantCallSite; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.util.Arrays; @SuppressWarnings("unused") public class CallSiteTest { public static int len() { return 0; } private static String printArgs(Object... args) { System.out.println(Arrays.deepToString(args)); return "aaa " + args.length; } public static void main(String[] args) throws Throwable { MethodHandles.Lookup lookup = MethodHandles.lookup(); // 找到前面定义的 #printArgs(Object[]) 私有方法 @SuppressWarnings("rawtypes") Class callerClass = lookup.lookupClass(); // (who am I?) MethodHandle printArgsMethod = lookup.findStatic(callerClass, "printArgs", MethodType.methodType(String.class, Object[].class)); CallSite callSite1 = new ConstantCallSite(printArgsMethod); callSite1.dynamicInvoker().invoke("xxx", "yyy"); callSite1.dynamicInvoker().invoke("xxx", "yyy", 111); } }