MethodHandle
JDK7为间接调用方法引入新的API,在java.lang.invoke
包下,可以看作为反射的升级版,但它不像反射API那样显得冗长、繁重
主要的类
MethodHandle
方法句柄、对可直接执行的方法的类型化引用,能够安全调用方法的对象。MethodHandle
是抽象类,无法直接实例化,需通过MethodHandles.Lookup
的工厂方法来创建
MethodType
每个方法句柄都有一个MethodType
实例,用来指明方法的返回类型和参数类型。
static MethodType methodType(Class<?> rtype, Class<?> ptype0, Class<?>... ptypes)
第一次参数是返回类型,后面的剩余参数是方法的参数类型
MethodHandles
这个类只包含操作或返回方法句柄的静态方法。它们分为以下几类:
- 查找方法,帮助创建方法和字段的方法句柄。
- 组合方法,将先前的方法合并或转换成新的方法。
- 其他工厂方法来创建方法来模拟其他常见的JVM操作或控制流模式
MethodHandles.Lookup
创建MethodHandle
只想的工厂方法查找类
MethodHandle findVirtual(Class<?> refc, String name, MethodType type)
查找方法名为name的方法MethodHandle findStatic(Class<?> refc, String name, MethodType type)
查找静态方法MethodHandle findSetter(Class<?> refc, String name, Class<?> type)
查找setter方法,name是该属性的名称,不是方法名称
使用示例
获取String类的replace方法,并传参调用
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodType mt = MethodType.methodType(String.class, char.class, char.class);
MethodHandle mh = lookup.findVirtual(String.class, "replace", mt);
String s = (String) mh.invokeExact("daddy",'d','n');
参考资料
- 《Java程序员修炼之道》
- Java SE 8 API Documentation
MethodHandle的更多相关文章
- 【JVM】2、关于jdk7的MethodHandle类
关于MethodHandle类,这个类是在jdk1.7之后加入的,这个类的作用类似函数指针的意思 这个类中有一个方法 这里我的jdk有一个问题,就是我在进行MethodHandle操作的时候,我们会发 ...
- java7 java MethodHandle解析
简介 JDK6之前我们会使用java反射来实现动态方法调用,多数框架用反射的比较多,例如mybatis.spring等.在JDK7中,新增了java.lang.invoke.MethodHandle( ...
- Java利用MethodHandle实现反射时调用super的method
一:实现 1.Base类的实现 package me.silentdoer.reflecsuper; /** * @author silentdoer * @version 1.0 * @descri ...
- java的MethodHandle类详解
一.总述 java7为间接调用方法提供了MethodHandle类,即方法句柄.可以将其看作是反射的另一种方式. 这是使用MethodHandle调用方法的一个例子: public class T ...
- # JDK7+ MethodHandle
简单例子 import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.i ...
- 动态方法调用秘密武器 —— invokedynamic 指令解读 - MethodHandle
原文:https://juejin.im/book/5c25811a6fb9a049ec6b23ee/section/5ccc66dd518825403b5975fb import java.lang ...
- java方法句柄-----4.你所不知道的MethodHandle【翻译】
Method Handles in Java 1.介绍 在本文中,我们将探讨一个重要的API,它是在Java 7中引入的,并在Java 7版本之后更加完善:全限定名是:Java.lang.invoke ...
- MethodHandle(方法句柄)系列之三:invoke和invokeExact的区别
先把代码贴上来,用的是一样的代码 /** * * @author LiuYeFeng<897908343@qq.com> * @date 2015年4月8日 下午10:41:13 * @C ...
- MethodHandle(方法句柄)系列之二:方法句柄的简单使用
二话不说,上代码 /** * * @author LiuYeFeng<897908343@qq.com> * @date 2015年4月8日 下午10:41:13 * @CopyRigh ...
随机推荐
- day 6 返回值,参数
1.函数返回值 In [3]: def divid(a,b): ...: shang = a//b ...: yushu = a%b ...: return shang,yushu ...: In [ ...
- 【MYSQL备份】利用mysqldump将一个数据库复制到另一个数据库
假设要将服务器A上的数据库test备份到服务器B 1.在服务器B上新建数据库cp_test mysql> create database cp_test; Query OK, row affec ...
- tp框架-------验证码
验证码我们一般很常见,在注册或登录时,都可以用的到,下面我们就来看看它的代码和用法 加验证码是为了防止表单攻击的一种方式,为了我们的程序更加的安全 在tp框架中它自带了一个验证码的类,我们先来看一下 ...
- Git生成SSH密钥
git config --global user.name "yangjianliang"配置用户名 git config --global user.email "52 ...
- 安装文件报错error while loading shared libraries: libssl.so.6
http://www.openssl.org/source/ 这里下载http://www.openssl.org/source/openssl-1.0.0r.tar.gz 安装命令为:tar -z ...
- day-19 多种优化模型下的简单神经网络tensorflow示例
如下样例基于tensorflow实现了一个简单的3层深度学习入门框架程序,程序主要有如下特性: 1. 基于著名的MNIST手写数字集样例数据:http://yann.lecun.com/exdb/m ...
- 重构:越来越长的 switch ... case 和 if ... else if ... else
在代码中,时常有就一类型码(Type Code)而展开的如 switch ... case 或 if ... else if ... else 的条件表达式.随着项目业务逻辑的增加及代码经年累月的修改 ...
- Linux下的计算器(bc、expr、dc、echo、awk)知多少?
linux 其他知识目录 原文链接:http://blog.chinaunix.net/uid-24673811-id-1760837.html linux下的三个命令可以用来作计算,下面一一讲解用法 ...
- 什么是Meta标签? 哪些Meta标签对搜索引擎SEO优化有作用?
什么是Meta标签? Meta标签给搜索引擎提供了许多关于网页的信息,这些信息都是隐含信息,意味着对于网页自身的访问者是不可见的. 你可以在网页的 <head>元素中发现<meta& ...
- CSS中水平居中设置的几种方式
1.行内元素: 如果被设置元素为文本.图片等行内元素时,水平居中是通过给父元素设置 text-align:center 来实现的. <body> <div class="t ...