zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    SQL整理5
    SQL整理1 数据类型
    SQL整理2
    JavaScript 的DOM操作
    JavaScript 数据类型
    JavaScript
    CSS样式表
    sqlserver数据库 提纲
    Python基础第十二天:二分法算法
    Python基础第十一天:递归函数
  • 原文地址:https://www.cnblogs.com/yytxdy/p/13262215.html
Copyright © 2011-2022 走看看