MethodHandle(方法句柄)系列之一:MethodHandle和MethodType

阅读此文章的作者建议先了解java反射和动态代理。

java7中为间接调用方法引入了新的api,其中最关键的是java.lang.invoke包,即方法句柄。我们可以看成是java反射的升级版,但是它不反射那样有时候显得冗长、繁重的粗糙。

方法句柄中首先涉及到两个重要的类,MethodHandle和MethodType。

MethodHandle

它是可对直接执行的方法(或域、构造方法等)的类型的引用,或者说,它是一个有能力安全调用方法的对象。换个方法来说,通过句柄我们可以直接调用该句柄所引用的底层方法。从作用上来看,方法句柄类似于反射中的Method类,但是方法句柄的功能更加强大、使用更加灵活、性能也更好。

 MethodType

它是表示方法签名类型的不可变对象。每个方法句柄都有一个MethodType实例,用来指明方法的返回类型和参数类型。它的类型完全由参数类型和方法类型来确定,而与它所引用的底层的方法的名称和所在的类没有关系。举个例子,例如String类的length方法和Integer类的intValue方法的方法句柄的类型就是一样的,因为这两个方法都没有参数,而且返回值类型都是int,则我们可以通过下列语句获取同一个方法类型:MethodType mt = MethodType.methodType(int.class);

MethodType的对象实例只能通过MethodType类中的静态工厂方法来创建,而且MethodType类的所有对象实例都是不可变的,类似于String类。如果修改了MethodType实例中的信息,就会生成另外一个MethodType实例。

参考资料:《java程序员修炼之道》、《深入理解java7核心技术与最佳实践》

时间: 2024-10-25 15:02:52

MethodHandle(方法句柄)系列之一:MethodHandle和MethodType的相关文章

MethodHandle(方法句柄)系列之三:invoke和invokeExact的区别

先把代码贴上来,用的是一样的代码 /** * * @author LiuYeFeng<[email protected]> * @date 2015年4月8日 下午10:41:13 * @CopyRight 2015 TopView Inc * @version V1.0 */ public class MethodHandleTest { public MethodHandle getHandler() { MethodHandle mh = null; MethodType mt = Me

MethodHandle(方法句柄)系列之二:方法句柄的简单使用

二话不说,上代码 /** * * @author LiuYeFeng<[email protected]> * @date 2015年4月8日 下午10:41:13 * @CopyRight 2015 TopView Inc * @version V1.0 */ public class MethodHandleTest { public MethodHandle getHandler() { MethodHandle mh = null; MethodType mt = MethodType

3.1.11 内置方法item系列--__getitem__(self,item)、__setitem__(self,item)、__delitem__(self,item)

使用字典的方式来操作类和对象 #item系列 class Foo: #Dict def __init__(self,name): self.name=name def __getitem__(self, item): #item='namexxx' # print('getitem...') return self.__dict__.get(item) def __setitem__(self, key, value): # print('setitem...') # print(key,val

python中函数和方法区别,以及如何给python类动态绑定方法和属性(涉及types.MethodType()和__slots__)

网上有很多同义但不同方式的说法,下面的这个说法比较让你容易理解和接受 1 与类和实例无绑定关系的function都属于函数(function): 2 与类和实例有绑定关系的function都属于方法(method). “与类和实例无绑定关系”就道出了其中的关键 我们知道python是动态的编程语言,python的类除了可以预先定义好外,还可以在执行过程中,动态地将函数绑定到类上,绑定成功后,那些函数就变成类的方法了. 定义User类 可以使用__slots__来限制绑定的属性和方法 1 user

JDK7动态方法调用

在JDK7中,Java提供了对动态语言特性的支持,实现了JSR 292 <Supporting Dynamically Typed Languages on the Java Platform>规范,这是Java语言发展的一重大进步,而提供对动态语言特性支持也是Java发展的一大趋势与方向.那么动态性表现在哪里呢?其一在Java API层面,新增了java.lang.invoke包,主要包含了CallSite.MethodHandle.MethodType等类:其二,在Java字节码指令层面,

JAVA反射系列之Field,java.lang.reflect.Field使用获取方法

JAVA反射系列之Field,java.lang.reflect.Field使用获取方法.   转载https://my.oschina.net/u/1407116/blog/209383 摘要 java.lang.reflect.Field使用 Field. 首先必须明一点 Field类主要是用来辅助获取和操作类的属性的! 1.怎么通过反射获取类的属性 先来看JDK提供的方法有如下几种: a)Class.getDeclaredField(String name);      返回一个 Fiel

JVM系列文章(四):类加载机制

作为一个程序员,仅仅知道怎么用是远远不够的.起码,你需要知道为什么可以这么用,即我们所谓底层的东西. 那到底什么是底层呢?我觉得这不能一概而论.以我现在的知识水平而言:对于Web开发者,TCP/IP.HTTP等等协议可能就是底层:对于C.C++程序员,内存.指针等等可能就是底层的东西.那对于Java开发者,你的Java代码运行所在的JVM可能就是你所需要去了解.理解的东西. 我会在接下来的一段时间,和读者您一起去学习JVM,所有内容均参考自<深入理解Java虚拟机:JVM高级特性与最佳实践>(

推荐:Java性能优化系列集锦

Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演进,内建了更为成熟的优化技术.运行时技术和垃圾收集器.与此同时,底层的硬件平台和操作系统也在演化. 目录: 一.Java性能优化系列之一--设计优化 二.Java性能优化系列之二--程序优化 三.Java性能优化系列之三--并发程序设计详解 四.Java性能优化系列之四--Java内存管理与垃圾回收

[jvm解析系列][九]类的加载过程和类的初始化。你的类该怎么执行?为什么需要ClassLoader?

通过前面好几章的或详细或不详细的介绍,我们终于把字节码的结构分析的差不多了.现在我们面临这样一个问题,如何运行一个字节码文件呢? 首先,java语言不同于其他的编译时需要进行链接工作的语言不通,java语言有一个很明显的特性,那就是动态加载,一个字节码的加载往往都是在程序运行的时候加载进来的,很多时候这种方式给我们带来了便利.虽然从某种意义上来说他可能消耗了一定的资源降低了性能. 类的生命周期? 没错,一个类的生命周期,在很多人眼里可能类天生都摆在那里了,随着程序生,随着程序死.但是事实情况并不