Java 类java.lang.invoke.MethodHandleInfo 实例源码

项目:Dyvil    文件:TypeConverter.java   
public static int invocationOpcode(int kind) throws InternalError
{
    switch (kind)
    {
    case MethodHandleInfo.REF_invokeStatic:
        return INVOKESTATIC;
    case MethodHandleInfo.REF_newInvokeSpecial:
        return INVOKESPECIAL;
    case MethodHandleInfo.REF_invokeVirtual:
        return INVOKEVIRTUAL;
    case MethodHandleInfo.REF_invokeInterface:
        return INVOKEINTERFACE;
    case MethodHandleInfo.REF_invokeSpecial:
        return INVOKESPECIAL;
    default:
        throw new InternalError("Unexpected invocation kind: " + kind);
    }
}
项目:openjdk-jdk10    文件:VarHandleBaseTest.java   
private static MethodHandle bind(VarHandle vh, MethodHandle mh, MethodType emt) {
    assertEquals(mh.type(), emt.insertParameterTypes(0, VarHandle.class),
                 "MethodHandle type differs from access mode type");

    MethodHandleInfo info = MethodHandles.lookup().revealDirect(mh);
    assertEquals(info.getMethodType(), emt,
                 "MethodHandleInfo method type differs from access mode type");

    return mh.bindTo(vh);
}
项目:openjdk-jdk10    文件:VarHandleTestReflection.java   
@Test(dataProvider = "accessModesProvider", expectedExceptions = IllegalArgumentException.class)
public void methodInvocationFromMethodInfo(VarHandle.AccessMode accessMode) throws Exception {
    VarHandle v = handle();

    // Try a reflective invoke using a Method obtained from cracking
    // a MethodHandle

    MethodHandle mh = MethodHandles.lookup().unreflect(
            VarHandle.class.getMethod(accessMode.methodName(), Object[].class));
    MethodHandleInfo info = MethodHandles.lookup().revealDirect(mh);
    Method im = info.reflectAs(Method.class, MethodHandles.lookup());
    im.invoke(v, new Object[]{});
}
项目:openjdk-jdk10    文件:VarHandleTestReflection.java   
@Test(dataProvider = "accessModesProvider", expectedExceptions = IllegalArgumentException.class)
public void reflectAsFromVarHandleInvoker(VarHandle.AccessMode accessMode) throws Exception {
    VarHandle v = handle();

    MethodHandle mh = MethodHandles.varHandleInvoker(
            accessMode, v.accessModeType(accessMode));

    MethodHandleInfo info = MethodHandles.lookup().revealDirect(mh);

    info.reflectAs(Method.class, MethodHandles.lookup());
}
项目:openjdk-jdk10    文件:VarHandleTestReflection.java   
@Test(dataProvider = "accessModesProvider", expectedExceptions = IllegalArgumentException.class)
public void reflectAsFromFindVirtual(VarHandle.AccessMode accessMode) throws Exception {
    VarHandle v = handle();

    MethodHandle mh = MethodHandles.publicLookup().findVirtual(
            VarHandle.class, accessMode.methodName(), v.accessModeType(accessMode));

    MethodHandleInfo info = MethodHandles.lookup().revealDirect(mh);

    info.reflectAs(Method.class, MethodHandles.lookup());
}
项目:openjdk9    文件:VarHandleBaseTest.java   
private static MethodHandle bind(VarHandle vh, MethodHandle mh, MethodType emt) {
    assertEquals(mh.type(), emt.insertParameterTypes(0, VarHandle.class),
                 "MethodHandle type differs from access mode type");

    MethodHandleInfo info = MethodHandles.lookup().revealDirect(mh);
    assertEquals(info.getMethodType(), emt,
                 "MethodHandleInfo method type differs from access mode type");

    return mh.bindTo(vh);
}
项目:openjdk9    文件:VarHandleTestReflection.java   
@Test(dataProvider = "accessModesProvider", expectedExceptions = IllegalArgumentException.class)
public void methodInvocationFromMethodInfo(VarHandle.AccessMode accessMode) throws Exception {
    VarHandle v = handle();

    // Try a reflective invoke using a Method obtained from cracking
    // a MethodHandle

    MethodHandle mh = MethodHandles.lookup().unreflect(
            VarHandle.class.getMethod(accessMode.methodName(), Object[].class));
    MethodHandleInfo info = MethodHandles.lookup().revealDirect(mh);
    Method im = info.reflectAs(Method.class, MethodHandles.lookup());
    im.invoke(v, new Object[]{});
}
项目:openjdk9    文件:VarHandleTestReflection.java   
@Test(dataProvider = "accessModesProvider", expectedExceptions = IllegalArgumentException.class)
public void reflectAsFromVarHandleInvoker(VarHandle.AccessMode accessMode) throws Exception {
    VarHandle v = handle();

    MethodHandle mh = MethodHandles.varHandleInvoker(
            accessMode, v.accessModeType(accessMode));

    MethodHandleInfo info = MethodHandles.lookup().revealDirect(mh);

    info.reflectAs(Method.class, MethodHandles.lookup());
}
项目:openjdk9    文件:VarHandleTestReflection.java   
@Test(dataProvider = "accessModesProvider", expectedExceptions = IllegalArgumentException.class)
public void reflectAsFromFindVirtual(VarHandle.AccessMode accessMode) throws Exception {
    VarHandle v = handle();

    MethodHandle mh = MethodHandles.publicLookup().findVirtual(
            VarHandle.class, accessMode.methodName(), v.accessModeType(accessMode));

    MethodHandleInfo info = MethodHandles.lookup().revealDirect(mh);

    info.reflectAs(Method.class, MethodHandles.lookup());
}
项目:PineappleCommons    文件:Reflection.java   
/**
 * Get the only method in the class with the given return and parameter types
 * <p>Throws an exception if no fields are found, or if multiple fields are found.</p>
 * <p>Fields may have a subclass of the required type, and primitives are interchangeable with wrappers. Therefore passing Object accepts all fields.</p>
 *
 * @param clazz      the type to find the method in
 * @param returnType the return type of the method to find
 * @param parameters the parameters of the method to find
 * @return the only method with the given return type and parameters
 * @throws IllegalArgumentException if there is more than one field with the given type
 * @throws IllegalArgumentException if not found
 * @throws NullPointerException     if any args are null
 */
public static MethodHandle findMethodWithType(Class<?> clazz, Class returnType, Class<?>... parameters) {
    ImmutableList<MethodHandle> methods = findMethodsWithType(clazz, returnType, parameters);
    StringBuilder builder;
    switch (methods.size()) {
        case 1:
            return methods.get(0);
        case 0:
            throw new IllegalArgumentException(format(
                    "Method in {} not found with type '({}){}'",
                    clazz.getTypeName(),
                    returnType,
                    Arrays.stream(parameters)
                            .map(Class::getTypeName)
                            .collect(Collectors.joining(","))
            ));
        default:
            throw new IllegalArgumentException(format(
                    "Multiple methods with type '({}){}' found in {}: {}",
                    returnType,
                    Arrays.stream(parameters)
                            .map(Class::getTypeName)
                            .collect(Collectors.joining(",")),
                    clazz.getTypeName(),
                    methods.stream()
                            .map(MethodHandles.lookup()::revealDirect)
                            .map(MethodHandleInfo::getName)
                            .collect(Collectors.joining(",", "[", "]"))
            ));
    }
}
项目:testrecorder    文件:LambdaSignature.java   
private MethodHandle implMethod(Lookup lookup, Class<?> implClass, MethodType implType) throws NoSuchMethodException, IllegalAccessException {
    switch (implMethodKind) {
    case MethodHandleInfo.REF_invokeInterface:
    case MethodHandleInfo.REF_invokeVirtual:
        return lookup.findVirtual(implClass, implMethodName, implType);
    case MethodHandleInfo.REF_invokeSpecial:
        return lookup.findSpecial(implClass, implMethodName, implType, implClass);
    case MethodHandleInfo.REF_invokeStatic:
        return lookup.findStatic(implClass, implMethodName, implType);
    default:
        throw new RuntimeException("Unsupported impl method kind " + implMethodKind);
    }
}
项目:testrecorder    文件:LambdaSignatureTest.java   
@SuppressWarnings("unchecked")
@Test
public void testSerializeStaticNonCapturing() throws Exception {
    SerializedLambda serializedLambda = Lambdas.serializeLambda(splus);

    assertThat(serializedLambda.getCapturedArgCount(), equalTo(0));

    LambdaSignature lambda = new LambdaSignature()
        .withCapturingClass(serializedLambda.getCapturingClass())
        .withInstantiatedMethodType(serializedLambda.getInstantiatedMethodType())
        .withFunctionalInterface(serializedLambda.getFunctionalInterfaceClass(), serializedLambda.getFunctionalInterfaceMethodName(), serializedLambda.getFunctionalInterfaceMethodSignature())
        .withImplMethod(serializedLambda.getImplClass(), serializedLambda.getImplMethodKind(), serializedLambda.getImplMethodName(), serializedLambda.getImplMethodSignature());
    assertThat(lambda.getCapturingClass(), equalTo("net/amygdalum/testrecorder/values/LambdaSignatureTest"));

    assertThat(lambda.getFunctionalInterfaceClass(), equalTo("java/util/function/BiFunction"));
    assertThat(lambda.getFunctionalInterfaceMethod().getDeclaringClass(), equalTo(BiFunction.class));
    assertThat(lambda.getFunctionalInterfaceMethodName(), equalTo("apply"));
    assertThat(lambda.getFunctionalInterfaceMethodSignature(), equalTo("(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"));
    assertThat(lambda.getFunctionalInterfaceMethod().getName(), equalTo("apply"));
    assertThat(lambda.getFunctionalInterfaceMethod().getParameterTypes(), arrayContaining(Object.class, Object.class));


    assertThat(lambda.getImplClass(), equalTo("net/amygdalum/testrecorder/values/LambdaSignatureTest"));
    assertThat(lambda.getImplMethod().getDeclaringClass(), equalTo(LambdaSignatureTest.class));
    assertThat(lambda.getImplMethodKind(), equalTo(MethodHandleInfo.REF_invokeStatic));
    assertThat(lambda.getImplMethodSignature(), equalTo("(Ljava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer;"));
    assertThat(lambda.getImplMethod().getParameterTypes(), arrayContaining(Integer.class, Integer.class));

    assertThat(lambda.getInstantiatedMethodType(), equalTo("(Ljava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer;"));
}
项目:testrecorder    文件:LambdaSignatureTest.java   
@SuppressWarnings("unchecked")
@Test
public void testSerializeStaticCapturing() throws Exception {
    SerializedLambda serializedLambda = Lambdas.serializeLambda(splusCapturing(42));

    assertThat(serializedLambda.getCapturedArgCount(), equalTo(1));
    assertThat(serializedLambda.getCapturedArg(0), equalTo(42));

    LambdaSignature lambda = new LambdaSignature()
        .withCapturingClass(serializedLambda.getCapturingClass())
        .withInstantiatedMethodType(serializedLambda.getInstantiatedMethodType())
        .withFunctionalInterface(serializedLambda.getFunctionalInterfaceClass(), serializedLambda.getFunctionalInterfaceMethodName(), serializedLambda.getFunctionalInterfaceMethodSignature())
        .withImplMethod(serializedLambda.getImplClass(), serializedLambda.getImplMethodKind(), serializedLambda.getImplMethodName(), serializedLambda.getImplMethodSignature());

    assertThat(lambda.getCapturingClass(), equalTo("net/amygdalum/testrecorder/values/LambdaSignatureTest"));

    assertThat(lambda.getFunctionalInterfaceClass(), equalTo("java/util/function/Function"));
    assertThat(lambda.getFunctionalInterfaceMethod().getDeclaringClass(), equalTo(Function.class));
    assertThat(lambda.getFunctionalInterfaceMethodName(), equalTo("apply"));
    assertThat(lambda.getFunctionalInterfaceMethodSignature(), equalTo("(Ljava/lang/Object;)Ljava/lang/Object;"));
    assertThat(lambda.getFunctionalInterfaceMethod().getName(), equalTo("apply"));
    assertThat(lambda.getFunctionalInterfaceMethod().getParameterTypes(), arrayContaining(Object.class));

    assertThat(lambda.getImplClass(), equalTo("net/amygdalum/testrecorder/values/LambdaSignatureTest"));
    assertThat(lambda.getImplMethodKind(), equalTo(MethodHandleInfo.REF_invokeStatic));
    assertThat(lambda.getImplMethodSignature(), equalTo("(ILjava/lang/Integer;)Ljava/lang/Integer;"));
    assertThat(lambda.getImplMethod().getParameterTypes(), arrayContaining(int.class, Integer.class));

    assertThat(lambda.getInstantiatedMethodType(), equalTo("(Ljava/lang/Integer;)Ljava/lang/Integer;"));
}
项目:testrecorder    文件:LambdaSignatureTest.java   
@SuppressWarnings("unchecked")
@Test
public void testSerializeInstanceCapturing() throws Exception {
    SerializedLambda serializedLambda = Lambdas.serializeLambda(this.splusInstanceCapturing());

    assertThat(serializedLambda.getCapturedArgCount(), equalTo(1));
    assertThat(serializedLambda.getCapturedArg(0), equalTo(this));

    LambdaSignature lambda = new LambdaSignature()
        .withCapturingClass(serializedLambda.getCapturingClass())
        .withInstantiatedMethodType(serializedLambda.getInstantiatedMethodType())
        .withFunctionalInterface(serializedLambda.getFunctionalInterfaceClass(), serializedLambda.getFunctionalInterfaceMethodName(), serializedLambda.getFunctionalInterfaceMethodSignature())
        .withImplMethod(serializedLambda.getImplClass(), serializedLambda.getImplMethodKind(), serializedLambda.getImplMethodName(), serializedLambda.getImplMethodSignature());

    assertThat(lambda.getCapturingClass(), equalTo("net/amygdalum/testrecorder/values/LambdaSignatureTest"));

    assertThat(lambda.getFunctionalInterfaceClass(), equalTo("java/util/function/Function"));
    assertThat(lambda.getFunctionalInterfaceMethod().getDeclaringClass(), equalTo(Function.class));
    assertThat(lambda.getFunctionalInterfaceMethodName(), equalTo("apply"));
    assertThat(lambda.getFunctionalInterfaceMethodSignature(), equalTo("(Ljava/lang/Object;)Ljava/lang/Object;"));
    assertThat(lambda.getFunctionalInterfaceMethod().getName(), equalTo("apply"));
    assertThat(lambda.getFunctionalInterfaceMethod().getParameterTypes(), arrayContaining(Object.class));

    assertThat(lambda.getImplClass(), equalTo("net/amygdalum/testrecorder/values/LambdaSignatureTest"));
    assertThat(lambda.getImplMethodKind(), equalTo(MethodHandleInfo.REF_invokeSpecial));
    assertThat(lambda.getImplMethodSignature(), equalTo("(Ljava/lang/Integer;)Ljava/lang/Integer;"));
    assertThat(lambda.getImplMethod().getParameterTypes(), arrayContaining(Integer.class));

    assertThat(lambda.getInstantiatedMethodType(), equalTo("(Ljava/lang/Integer;)Ljava/lang/Integer;"));
}
项目:ProjectAres    文件:MethodResolver.java   
public MethodHandleInfo virtualInfo(Class<?> target, String name, MethodType type) throws NoSuchMethodException, IllegalAccessException {
    return lookup.revealDirect(virtualHandle(target, name, type));
}
项目:ProjectAres    文件:MethodResolver.java   
public MethodHandleInfo virtualInfo(Class<?> target, Method called) throws NoSuchMethodException, IllegalAccessException {
    return virtualInfo(target, called.getName(), Methods.methodType(called));
}
项目:testrecorder    文件:LambdaSignature.java   
private boolean isInstanceMethod() {
    return implMethodKind != MethodHandleInfo.REF_invokeStatic;
}
项目:es6draft    文件:DebugInfo.java   
private MethodHandleInfo info() {
    if (info == null) {
        info = MethodHandles.publicLookup().revealDirect(handle);
    }
    return info;
}
项目:lightmare    文件:DirectFieldResolver.java   
/**
 * Validates implementation method kind (for invoke virtual and invoke
 * interface)
 * 
 * @param lambda
 * @return <code>boolean</code> validation result
 */
private static boolean validateMethodKind(LambdaInfo lambda) {

    boolean valid;

    int kind = lambda.getImplMethodKind();
    valid = ((kind == MethodHandleInfo.REF_invokeVirtual) || (kind == MethodHandleInfo.REF_invokeInterface));

    return valid;
}