// 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 invokepolymorphic; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; class Data { } public class InvokePolymorphic { public String buildString(Integer i1, int i2, String s) { return (i1 == null ? "N" : "!N") + "-" + i2 + "-" + s; } public void testInvokePolymorphic() { MethodType mt = MethodType.methodType(String.class, Integer.class, int.class, String.class); MethodHandles.Lookup lk = MethodHandles.lookup(); try { MethodHandle mh = lk.findVirtual(getClass(), "buildString", mt); System.out.println(mh.invoke(this, null, 1, "string")); } catch (Throwable t) { t.printStackTrace(); } } public String buildString( byte b, char c, short s, float f, double d, long l, Integer i1, int i2, String str) { return b + "-" + c + "-" + s + "-" + f + "-" + d + "-" + l + "-" + (i1 == null ? "N" : "!N") + "-" + i2 + "-" + str; } public void testInvokePolymorphicRange() { MethodType mt = MethodType.methodType(String.class, byte.class, char.class, short.class, float.class, double.class, long.class, Integer.class, int.class, String.class); MethodHandles.Lookup lk = MethodHandles.lookup(); try { MethodHandle mh = lk.findVirtual(getClass(), "buildString", mt); System.out.println( mh.invoke(this, (byte) 2, 'a', (short) 0xFFFF, 1.1f, 2.24d, 12345678L, null, 1, "string")); } catch (Throwable t) { t.printStackTrace(); } } public static void testWithAllTypes( boolean z, char a, short b, int c, long d, float e, double f, String g, Object h) { System.out.println(z); System.out.println(a); System.out.println(b); System.out.println(c); System.out.println(d); System.out.println(e); System.out.println(f); System.out.println(g); System.out.println(h); } public void testInvokePolymorphicWithAllTypes() { try { MethodHandle mth = MethodHandles.lookup() .findStatic( InvokePolymorphic.class, "testWithAllTypes", MethodType.methodType( void.class, boolean.class, char.class, short.class, int.class, long.class, float.class, double.class, String.class, Object.class)); mth.invokeExact(false,'h', (short) 56, 72, Integer.MAX_VALUE + 42l, 0.56f, 100.0d, "hello", (Object) "goodbye"); } catch (Throwable t) { t.printStackTrace(); } } public MethodHandle testInvokePolymorphicWithConstructor() { MethodHandle mh = null; MethodType mt = MethodType.methodType(void.class); MethodHandles.Lookup lk = MethodHandles.lookup(); try { mh = lk.findConstructor(Data.class, mt); System.out.println(mh.invoke().getClass() == Data.class); } catch (Throwable t) { t.printStackTrace(); } return mh; } public static void main(String[] args) { InvokePolymorphic invokePolymorphic = new InvokePolymorphic(); invokePolymorphic.testInvokePolymorphic(); invokePolymorphic.testInvokePolymorphicRange(); invokePolymorphic.testInvokePolymorphicWithAllTypes(); invokePolymorphic.testInvokePolymorphicWithConstructor(); } }