3528N/A * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. 3011N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3011N/A * This code is free software; you can redistribute it and/or modify it 3011N/A * under the terms of the GNU General Public License version 2 only, as 3011N/A * published by the Free Software Foundation. Oracle designates this 3011N/A * particular file as subject to the "Classpath" exception as provided 3011N/A * by Oracle in the LICENSE file that accompanied this code. 3011N/A * This code is distributed in the hope that it will be useful, but WITHOUT 3011N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 3011N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 3011N/A * version 2 for more details (a copy is included in the LICENSE file that 3011N/A * You should have received a copy of the GNU General Public License version 3011N/A * 2 along with this work; if not, write to the Free Software Foundation, 3011N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 3011N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 3011N/A * or visit www.oracle.com if you need additional information or have any 3793N/A * @summary example code used in javadoc for java.lang.invoke API 4250N/A -DJavaDocExamplesTest.verbosity=1 \ 3011N/A /** Wrapper for running the JUnit tests in this module. 3011N/A * Put JUnit on the classpath! 3011N/A// static final private MethodHandle CONCAT_1 = LOOKUP.findVirtual(String.class, 3011N/A// "concat", methodType(String.class, String.class)); 3011N/A// static final private MethodHandle HASHCODE_1 = LOOKUP.findVirtual(Object.class, 3011N/A// "hashCode", methodType(int.class)); 3530N/A// form required if ReflectiveOperationException is intercepted: 4250N/A static int add(
int x,
int y) {
return x + y; }
4250N/A static int sub(
int x,
int y) {
return x - y; }
3011N/A//assertEquals("xy", (String) CONCAT_1.invokeExact("x", "y")); 3241N/A//assertEquals("xy".hashCode(), (int) HASHCODE_1.invokeExact((Object)"xy")); 3528N/A// weakly typed invocation (using MHs.invoke) 3528N/A// mt is (Object,Object,Object)Object 4250N/A// spread both arguments from a 2-array: 4250N/A// spread both arguments from a String array: 4250N/A// spread second arguments from a 1-array: 4250N/A// spread no arguments from a 0-array or null: 4250N/A// asSpreader and asCollector are approximate inverses: 4250N/Afor (
int n =
0; n <=
2; n++) {
4250N/A//assertEquals("[won]", (String) ts1.invokeExact( new Object[]{"won"})); //FAIL 4250N/A// arrayType can be a subtype of Object[] 4250N/A// collectors can be nested, Lisp-style 4250N/A// arrayType can be any primitive array type 4250N/A// findStatic of Arrays.asList(...) produces a variable arity method handle: 4250N/A// (mutation can be continued indefinitely) 4250N/A * The same call site may be used in several places at once. 4250N/A// the following steps may be repeated to re-use the same switch point: 5452N/A// argument-based dispatch for methods of the form boolean x.___(y: String) 5452N/A// wrap tracing around the dispatch and invoke steps: 5452N/A// compose the dispatcher and the invoker: 4250N/A @Test public void testFoo() throws Throwable {