jdk/test/java/lang/invoke/VarHandles/VarHandleTestReflection.java
author psandoz
Tue, 17 May 2016 12:06:41 +0200
changeset 38328 40435a469d25
parent 37343 35a2231828a7
permissions -rw-r--r--
8156485: MethodHandles.varHandleExactInvoker should perform exact checks Reviewed-by: vlivanov
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     1
/*
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     2
 * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     4
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     7
 * published by the Free Software Foundation.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     8
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    13
 * accompanied this code).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    14
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    18
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    21
 * questions.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    22
 */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    23
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    24
/*
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    25
 * @test
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    26
 * @run testng VarHandleTestReflection
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    27
 */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    28
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    29
import org.testng.annotations.DataProvider;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    30
import org.testng.annotations.Test;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    31
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    32
import java.lang.invoke.MethodHandle;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    33
import java.lang.invoke.MethodHandleInfo;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    34
import java.lang.invoke.MethodHandles;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    35
import java.lang.invoke.VarHandle;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    36
import java.lang.reflect.Method;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    37
import java.util.stream.Stream;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    38
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    39
public class VarHandleTestReflection extends VarHandleBaseTest {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    40
    String string;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    41
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    42
    @DataProvider
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    43
    public static Object[][] accessModesProvider() {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    44
        return Stream.of(VarHandle.AccessMode.values()).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    45
                map(am -> new Object[]{am}).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    46
                toArray(Object[][]::new);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    47
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    48
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    49
    static VarHandle handle() throws Exception {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    50
        return MethodHandles.lookup().
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    51
                findVarHandle(VarHandleTestReflection.class, "string", String.class);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    52
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    53
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    54
    @Test(dataProvider = "accessModesProvider", expectedExceptions = IllegalArgumentException.class)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    55
    public void methodInvocation(VarHandle.AccessMode accessMode) throws Exception {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    56
        VarHandle v = handle();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    57
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    58
        // Try a reflective invoke using a Method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    59
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36934
diff changeset
    60
        Method vhm = VarHandle.class.getMethod(accessMode.methodName(), Object[].class);
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    61
        vhm.invoke(v, new Object[]{});
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    62
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    63
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    64
    @Test(dataProvider = "accessModesProvider", expectedExceptions = UnsupportedOperationException.class)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    65
    public void methodHandleInvoke(VarHandle.AccessMode accessMode) throws Throwable {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    66
        VarHandle v = handle();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    67
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    68
        // Try a reflective invoke using a MethodHandle
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    69
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    70
        MethodHandle mh = MethodHandles.lookup().unreflect(
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36934
diff changeset
    71
                VarHandle.class.getMethod(accessMode.methodName(), Object[].class));
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    72
        // Use invoke to avoid WrongMethodTypeException for
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    73
        // non-signature-polymorphic return types
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    74
        Object o = (Object) mh.invoke(v, new Object[]{});
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    75
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    76
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    77
    @Test(dataProvider = "accessModesProvider", expectedExceptions = IllegalArgumentException.class)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    78
    public void methodInvocationFromMethodInfo(VarHandle.AccessMode accessMode) throws Exception {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    79
        VarHandle v = handle();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    80
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    81
        // Try a reflective invoke using a Method obtained from cracking
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    82
        // a MethodHandle
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    83
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    84
        MethodHandle mh = MethodHandles.lookup().unreflect(
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36934
diff changeset
    85
                VarHandle.class.getMethod(accessMode.methodName(), Object[].class));
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    86
        MethodHandleInfo info = MethodHandles.lookup().revealDirect(mh);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    87
        Method im = info.reflectAs(Method.class, MethodHandles.lookup());
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    88
        im.invoke(v, new Object[]{});
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    89
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    90
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    91
    @Test(dataProvider = "accessModesProvider", expectedExceptions = IllegalArgumentException.class)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    92
    public void reflectAsFromVarHandleInvoker(VarHandle.AccessMode accessMode) throws Exception {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    93
        VarHandle v = handle();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    94
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    95
        MethodHandle mh = MethodHandles.varHandleInvoker(
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    96
                accessMode, v.accessModeType(accessMode));
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    97
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    98
        MethodHandleInfo info = MethodHandles.lookup().revealDirect(mh);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    99
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   100
        info.reflectAs(Method.class, MethodHandles.lookup());
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   101
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   102
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   103
    @Test(dataProvider = "accessModesProvider", expectedExceptions = IllegalArgumentException.class)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   104
    public void reflectAsFromFindVirtual(VarHandle.AccessMode accessMode) throws Exception {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   105
        VarHandle v = handle();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   106
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   107
        MethodHandle mh = MethodHandles.publicLookup().findVirtual(
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36934
diff changeset
   108
                VarHandle.class, accessMode.methodName(), v.accessModeType(accessMode));
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   109
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   110
        MethodHandleInfo info = MethodHandles.lookup().revealDirect(mh);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   111
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   112
        info.reflectAs(Method.class, MethodHandles.lookup());
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   113
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   114
}