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

  • 相关阅读:
    如何打开windows的远程桌面
    mongodb存储引擎
    使用场景举例
    webpack初识
    mongodb快速入门
    mongodb初识
    mysql主从复制与读写分离
    gradle简单配置跟模块依赖
    mysql执行计划
    synchronized的可见性理解
  • 原文地址:https://www.cnblogs.com/yytxdy/p/13262215.html
Copyright © 2011-2022 走看看