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