java7 MethodHandle学习笔记
来源:互联网 发布:rocketmq php客户端 编辑:程序博客网 时间:2024/05/21 08:03
转载 http://blog.csdn.net/aesop_wubo/article/details/48858931
简介
java7在JSR 292中增加了对动态类型语言的支持,使java也可以像C语言那样将方法作为参数传递,其实现在lava.lang.invoke包中。MethodHandle作用类似于反射中的Method类,但它比Method类要更加灵活和轻量级。通过MethodHandle进行方法调用一般需要以下几步:
(1)创建MethodType对象,指定方法的签名;
(2)在MethodHandles.Lookup中查找类型为MethodType的MethodHandle;
(3)传入方法参数并调用MethodHandle.invoke或者MethodHandle.invokeExact方法。
MethodType
可以通过MethodHandle类的type方法查看其类型,返回值是MethodType类的对象。也可以在得到MethodType对象之后,调用MethodHandle.asType(mt)方法适配得到MethodHandle对象。可以通过调用MethodType的静态方法创建MethodType实例,有三种创建方式:
(1)methodType及其重载方法:需要指定返回值类型以及0到多个参数;
(2)genericMethodType:需要指定参数的个数,类型都为Object;
(3)fromMethodDescriptorString:通过方法描述来创建。
创建好MethodType对象后,还可以对其进行修改,MethodType类中提供了一系列的修改方法,比如:changeParameterType、changeReturnType等。
Lookup
MethodHandle.Lookup相当于MethodHandle工厂类,通过findxxx方法可以得到相应的MethodHandle,还可以配合反射API创建MethodHandle,对应的方法有unreflect、unreflectSpecial等。
invoke
在得到MethodHandle后就可以进行方法调用了,有三种调用形式:
(1)invokeExact:调用此方法与直接调用底层方法一样,需要做到参数类型精确匹配;
(2)invoke:参数类型松散匹配,通过asType自动适配;
(3)invokeWithArguments:直接通过方法参数来调用。其实现是先通过genericMethodType方法得到MethodType,再通过MethodHandle的asType转换后得到一个新的MethodHandle,最后通过新MethodHandle的invokeExact方法来完成调用。
附MethodHandle作为参数的示例代码:
- java7 MethodHandle学习笔记
- java7 MethodHandle学习笔记
- java7 MethodHandle学习笔记
- java7 invokedynamic学习笔记
- java7并发编程学习笔记
- MethodHandle
- Java7线程学习笔记(一)
- Java7线程学习笔记(二)
- Java7线程学习笔记(三)
- Java7线程学习笔记(四)
- Java7线程学习笔记(五)
- Java7线程学习笔记(六)
- JAVA7 的ForkJoin框架-学习笔记
- Java7并发学习笔记(一)
- java7 笔记
- Java7天学习
- JAVA7特性学习
- Java7特性学习
- CSS3 3D Transform perspective 以及scale3d记录
- Maven构建MyBatis项目Demo
- Apache Spark 2.2.0 中文文档
- FTPrep, 82 Remove Duplicates from Sorted List II
- ES6之块级作用域分析
- java7 MethodHandle学习笔记
- 58数据库规约
- the transaction flow in v1.0 of Hyperledger Fabric(fabric1.0交易流程)
- CentOs 常用命令
- 深度、广度优先遍历树
- Kafka消息队列堆积问题
- 在土耳其,他是阿里唯一的员工
- how to movement and control sluggish materials呆滞物料移动
- Angularjs 完成购物车