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的更多相关文章

  1. 【JVM】2、关于jdk7的MethodHandle类

    关于MethodHandle类,这个类是在jdk1.7之后加入的,这个类的作用类似函数指针的意思 这个类中有一个方法 这里我的jdk有一个问题,就是我在进行MethodHandle操作的时候,我们会发 ...

  2. java7 java MethodHandle解析

    简介 JDK6之前我们会使用java反射来实现动态方法调用,多数框架用反射的比较多,例如mybatis.spring等.在JDK7中,新增了java.lang.invoke.MethodHandle( ...

  3. Java利用MethodHandle实现反射时调用super的method

    一:实现 1.Base类的实现 package me.silentdoer.reflecsuper; /** * @author silentdoer * @version 1.0 * @descri ...

  4. java的MethodHandle类详解

    一.总述   java7为间接调用方法提供了MethodHandle类,即方法句柄.可以将其看作是反射的另一种方式. 这是使用MethodHandle调用方法的一个例子: public class T ...

  5. # JDK7+ MethodHandle

    简单例子 import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.i ...

  6. 动态方法调用秘密武器 —— invokedynamic 指令解读 - MethodHandle

    原文:https://juejin.im/book/5c25811a6fb9a049ec6b23ee/section/5ccc66dd518825403b5975fb import java.lang ...

  7. java方法句柄-----4.你所不知道的MethodHandle【翻译】

    Method Handles in Java 1.介绍 在本文中,我们将探讨一个重要的API,它是在Java 7中引入的,并在Java 7版本之后更加完善:全限定名是:Java.lang.invoke ...

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

    先把代码贴上来,用的是一样的代码 /** * * @author LiuYeFeng<897908343@qq.com> * @date 2015年4月8日 下午10:41:13 * @C ...

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

     二话不说,上代码 /** * * @author LiuYeFeng<897908343@qq.com> * @date 2015年4月8日 下午10:41:13 * @CopyRigh ...

随机推荐

  1. HBase核心功能模块--读书笔记

    客户端Client 客户端 Client 是整个 HBase 系统的入口.使用者直接通过客户端操作 HBase.客户端 使用 HBase 的 RPC 机制与 HMaster 和 RegionServe ...

  2. javaweb(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  3. JavaScript 中函数的参数

    functionName(parameter1, parameter2, parameter3) { // 要执行的代码…… } 参数规则 JavaScript 函数定义时形参没有指定数据类型. Ja ...

  4. AtCoder Regular Contest 101 D - Median of Medians

    二分答案 然后前缀和+树状数组来判断这个答案是否大于等于数 如果我们对于一个查询,如果小于这个数令为1,大于这个数领为-1 将所有前缀和放在树状数组中,就可以查询所有sum_{l} < sum_ ...

  5. [转]50 Tips for Working with Unity (Best Practices)

    About these tips These tips are not all applicable to every project. They are based on my experience ...

  6. python爬取淘宝华为手机

    import re from selenium import webdriver from selenium.common.exceptions import TimeoutException fro ...

  7. 集合set、map、list

    一.set 无序.可重复 public static void main(String[] args){ Set<String> set=new HashSet<String> ...

  8. 【win10系统问题】远程桌面登录一次后,第二次登录看不到用户名和密码输入框

    [win10系统远程桌面登录问题] 远程桌面登录某服务器一次后,第二次登录看不到用户名和密码输入框 [解决方法] 在注册表里找到该路径下的远程服务器ip,删除即可: HKEY_CURRENT_USER ...

  9. 使用Scrapy构建一个网络爬虫

    记得n年前项目需要一个灵活的爬虫工具,就组织了一个小团队用Java实现了一个爬虫框架,可以根据目标网站的结构.地址和需要的内容,做简单的配置开发,即可实现特定网站的爬虫功能.因为要考虑到各种特殊情形, ...

  10. 树状数组怒刷sum!!!(前缀和应用)

    我们知道我们利用树状数组维护的是存到其中的a[ ]数组,但是我们做题需要的是sum[ ]数组,这才是我们真正需要的有用的信息,写这篇博客的目的便是整理一下sum数组是怎么样来应用解题的. 1. Sta ...