| // Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| package invokecustom; | |
| 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; | |
| class ArgumentType { | |
| } | |
| class ReturnType { | |
| } | |
| interface I { | |
| default ReturnType targetMethodTest4(ArgumentType arg) { | |
| System.out.println("I.targetMethodTest4"); | |
| return new ReturnType(); | |
| } | |
| } | |
| class Middle implements I { | |
| } | |
| class Sub extends Middle { | |
| } | |
| interface I2 { | |
| default ReturnType targetMethodTest5(ArgumentType arg) { | |
| System.out.println("I2.targetMethodTest5"); | |
| return new ReturnType(); | |
| } | |
| } | |
| class Impl implements I2 { | |
| @Override | |
| public ReturnType targetMethodTest5(ArgumentType arg) { | |
| System.out.println("Impl.targetMethodTest5"); | |
| return new ReturnType(); | |
| } | |
| } | |
| public class InvokeCustom { | |
| private static String staticField1 = "StaticField1"; | |
| private static void targetMethodTest1() { | |
| System.out.println("Hello World!"); | |
| } | |
| private static void targetMethodTest2(MethodHandle mhInvokeStatic, MethodHandle mhGetStatic) | |
| throws Throwable { | |
| mhInvokeStatic.invokeExact(); | |
| System.out.println(mhGetStatic.invoke()); | |
| } | |
| private static void targetMethodTest3(MethodType mt) | |
| throws Throwable { | |
| System.out.println("MethodType: " + mt.toString()); | |
| } | |
| public static CallSite bsmLookupStatic(MethodHandles.Lookup caller, String name, MethodType type) | |
| throws NoSuchMethodException, IllegalAccessException { | |
| final MethodHandles.Lookup lookup = MethodHandles.lookup(); | |
| final MethodHandle targetMH = lookup.findStatic(lookup.lookupClass(), name, type); | |
| return new ConstantCallSite(targetMH.asType(type)); | |
| } | |
| public static void doInvokeSubWithArg(MethodHandle handle) throws Throwable { | |
| handle.invoke(new Sub(), new ArgumentType()); | |
| } | |
| public static void doInvokeExactImplWithArg(MethodHandle handle) throws Throwable { | |
| ReturnType result = (ReturnType) handle.invokeExact(new Impl(), new ArgumentType()); | |
| } | |
| } |