java基于MethodHandle调用方法

MethodHandle是jdk1.7加入的新特性,可以提供与反射类似的能力,但是其性能上要优于反射

添加测试类

public class MethodHandleTest {
    public Object print(Object obj) {
        System.out.println(obj);
        return obj;
    }
}

添加MethodHandle查找方法,MethodType第一个参数是返回类型,其后是参数类型,如果返回为空,则是void.class

MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodType methodType = MethodType.methodType(Object.class, Object.class);
MethodHandle methodHandle = lookup.findVirtual(MethodHandleTest.class, "print", methodType);

 

分别调用以下方法,可以看到相应的输出 

methodHandle.invoke(new MethodHandleTest(), "test");
Object o = methodHandle.invokeExact(new MethodHandleTest(), (Object) "test");

  

invoke方法与invokeExact方法的区别是,invokeExact会对方法的返回值,以及入参做类型校验,如果使用以下调用方式,则会报出异常

methodHandle.invokeExact(new MethodHandleTest(), (Object) "test");
Object o = methodHandle.invokeExact(new MethodHandleTest(), "test");

java.lang.invoke.WrongMethodTypeException: expected (MethodHandleTest,Object)Object but found (MethodHandleTest,String)Object

原文地址:https://www.cnblogs.com/yytxdy/p/13262215.html