methodhandle_概览Java 7 MethodHandle及其用法

methodhandle

由于Java的Reflection API,我们已经能够在运行时检查和更改程序执行。 特别是,我们可以在运行时观察接口/类/方法和字段,而无需在编译时知道它们的名称。

JDK 7为这种动态/运行时检查引入了一个新的参与者,即方法句柄(即抽象类java.dyn.MethodHandle的子类)。 方法句柄为我们提供了调用非公共方法的不受限制的功能,例如,可以由访问它的类在非公共方法上形成它。 与使用Reflection API相比,访问检查是在创建方法句柄时执行的,而不是每次调用该方法时都执行。

假设我们有一个需要允许对其私有方法之一进行受控访问的类。 下面的类定义了此方法并描述了两种访问方法(Reflection / MethodHandle)。

public class MethodAccessExampleWithArgs {private final int i;public MethodAccessExampleWithArgs(int i_) {i = i_;}private void bar(int j, String msg) {System.out.println("Private Method \'bar\' successfully accessed : "+ i + ", " + j + " : " + msg + "!");}// Using Reflectionpublic static Method makeMethod() {Method meth = null;try {Class[] argTypes = new Class[] { int.class, String.class };meth = MethodAccessExampleWithArgs.class.getDeclaredMethod("bar",argTypes);meth.setAccessible(true);} catch (IllegalArgumentException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();}return meth;}// Using method handlespublic static MethodHandle makeMh() {MethodHandle mh;MethodType desc = MethodType.methodType(void.class, int.class,String.class);try {mh = MethodHandles.lookup().findVirtual(MethodAccessExampleWithArgs.class, "bar", desc);System.out.println("mh=" + mh);} catch (NoAccessException e) {throw (AssertionError) new AssertionError().initCause(e);}return mh;}
}

以下是一个类,用于测试访问私有方法“ bar”的两种方法:

public class MethodAccessMain {private static void withReflectionArgs() {Method meth = MethodAccessExampleWithArgs.makeMethod();MethodAccessExampleWithArgs mh0 = new MethodAccessExampleWithArgs(0);MethodAccessExampleWithArgs mh1 = new MethodAccessExampleWithArgs(1);try {System.out.println("Invocation using Reflection");meth.invoke(mh0, 5, "Jabba the Hutt");meth.invoke(mh1, 7, "Boba Fett");} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}private static void withMhArgs() {MethodHandle mh = MethodAccessExampleWithArgs.makeMh();MethodAccessExampleWithArgs mh0 = new MethodAccessExampleWithArgs(0);MethodAccessExampleWithArgs mh1 = new MethodAccessExampleWithArgs(1);try {System.out.println("Invocation using Method Handle");mh.invokeExact(mh0, 42, "R2D2");mh.invokeExact(mh1, 43, "C3PO");} catch (Throwable e) {e.printStackTrace();}}public static void main(String[] args) {withReflectionArgs();withMhArgs();}
}



如何运行代码– JDK7 b129和Netbeans 7.0 Beta 2

上面的代码已经在Netbeans IDE 7.0 Beta 2下使用JDK 7的内部版本129进行了测试,并且要运行,它需要以下额外的VMOptions: -XX:+ UnlockExperimentalVMOptions -XX:+ EnableMethodHandles -XX:+ EnableInvokeDynamic“运行”>下>设置项目配置>>自定义>> VMoptions ,以便在不接收运行时异常的情况下使用InvokeDynamic和MethodHandle。

JDK7 b131和Netbeans 7.0 Beta 2的问题

如果您已升级到最新版本131,则结果将取决于编译和运行代码的环境。 更具体地说,Netbeans IDE 7.0 Beta 2输出以下内容:

run:
Invocation using Reflection
Private Method 'bar' successfully accessed : 0, 5 : Jabba the Hutt!
Private Method 'bar' successfully accessed : 1, 7 : Boba Fett!java.dyn.WrongMethodTypeException: (ILjava/lang/String;)V cannot be called as ([Ljava/lang/Object;)Ljava/lang/Object;
mh=bar(MethodAccessExampleWithArgs,int,String)void
Invocation using Method Handle
at ben.example.MethodAccessMain.withMhArgs(MethodAccessMain.java:46)
at ben.example.MethodAccessMain.main(MethodAccessMain.java:55)BUILD SUCCESSFUL (total time: 0 seconds)

JDK7 b131和Eclipse 3.6.2的问题

该示例已在Eclipse 3.6.2 Helios上使用相同的参数-XX:+ UnlockExperimentalVMOptions -XX:+ EnableMethodHandles -XX:+ EnableInvokeDynamic“运行>>运行配置>>参数>> VM参数”下进行了进一步测试,但是我们已经提供相同的输出。

从已经提示我们的异常中,我们可以看到,我们的方法原本是用int(I),字符串(Ljava / lang / String)调用并返回void(V)来调用的,而不是使用Object的数组,并返回一个Object。 这表明在IDE中使用的编译器存在一些问题(可能与命令行编译器不同)。

在命令行上运行代码JDK7 b131

如果您碰巧在计算机上构建了129后JDK7,并且希望运行上述示例而没有任何问题,则可能应该坚持编译(javac)并运行( java -XX:+ UnlockExperimentalVMOptions -XX:+ EnableMethodHandles -XX:+ EnableInvokeDynamic com.wgjd.MethodHandleExample.MethodAccessMain )从命令行输入MethodHandle代码。

修复了JDK7 b131和IDE

目前尚无确定何时可以运行方法句柄而没有额外的VMOptions开销的日期,但是如果您想跟上达芬奇机器项目的最新动态,请注意动态调用的实现,确保您已订阅其邮件列表 。

还值得一提的是,从前面提到的邮件列表中,我们发现有一个复杂的更改,该更改将多包代码合并到一个包中,并包括准备从java.dynjava.lang的干净重命名。调用 。 修复由于多个包之间的依赖性而导致的API中的某些缺陷是必需的。

参考文献:

  • Java 7开发人员博客上的 JCG合作伙伴介绍了MethodHandle及其用法
  • 经验丰富的Java开发人员

编码愉快! 不要忘记分享!

拜伦

相关文章:

  • JDK中的设计模式
  • Java内存模型-快速概述和注意事项
  • Java Fork / Join进行并行编程
  • 依赖注入–手动方式
  • 了解和扩展Java ClassLoader

翻译自: https://www.javacodegeeks.com/2011/03/glimpse-at-java-7-methodhandle-and-its.html

methodhandle

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

quartz CronExpression表达式

一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。按顺序依次为1.秒(0~59)2.分钟(0~59)3.小时(0~23)4.天(月)(0~31,但是你需…

java两个字符串前缀_java – 找到两个字符串的最长公共前缀

我想找到两个字符串的最长公共前缀.有没有办法循环我的最后几个if语句,以便我可以结束彼此不匹配的最后几个字符?System.out.println("Enter the first string: ");String s input.nextLine();System.out.println("Enter the second string: "…

Codeforces 427 D. Match amp; Catch

后缀数组.... 在两个串中唯一出现的最小公共子串 D. Match & Catchtime limit per test1 secondmemory limit per test512 megabytesinputstandard inputoutputstandard outputPolice headquarter is monitoring signal on different frequency levels. They have got two …

gwt 同步和异步_GWT Spring和Hibernate进入数据网格世界

gwt 同步和异步利用Infinispan Data Grid的功能最大化Hibernate性能。 一个GWT , Spring , JPA , Hibernate , Infinispan集成教程。 在本教程中,我们将讨论如何将Infinispan用作Hibernate二级缓存提供程序。 Infinis…

java分页 jar_零基础学java之javaEE,分页

【分页】一 分页1.1分页概念引入什么是分页?分页(英语:Paging),是一种操作系统里存储器管理的一种技术,可以使电脑的主存可以使用存储在辅助存储器中的数据。操作系统会将辅助存储器(通常是磁盘)中的数据分区成固定大小的区块,称…

查看修改MySQL字符集

查看修改MySQL字符集 http://blog.sina.com.cn/s/blog_70ac6bec01016fts.html 查看修改MySQL字符集 (2012-08-22 09:53:21) 转载▼标签: 字符集 mysql数据库 mysql字符集查看 mysql启动命令 修改mysql字符集 分类: 网站开发MySQL字符集多种多样…

java上传文件需要的依赖_SpringBoot使用commons-fileupload上传文件的类

网上找了一些,都是基本介绍,没有直接就可以使用类,在实际工作当中都有适合当前项目的上传文件的方法,本人写了一个类,比较基础,但呆以满足项目的上传文件功能,使用了commons-fileupload这个组件…

ArcGIS for Android示例解析之离线地图-----LocalTiledLayer

转自:http://blog.csdn.net/wozaifeiyang0/article/details/7327423 LocalTiledLayer 看到这个标题是否是很激动,如题,该示例就是添加一个离线地图,这应该是很多开发人员期盼已久的功能了吧,正式版一处这个应该是一个很…

md5 算法java实现_java实现MD5算法

import java.security.MessageDigest;/** 加密工具*author 刘彦青***/public class EncryptUtil {/** MD5加密** param jiami* 源字符串* return 加密后的字符串 */public final static String md5(String jiami) {char hexDigits[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C,…

wikioi 1017--乘积最大

给定一个数串,以及K,求对这个数串K划分的乘积最大值。 DP思路:一开始肯定想到的是递归,假设在某两个字符间有一个乘号,那么乘积最大就是乘号两边的区间接着划分的乘积最大值。 于是状态空间表示如下dp[i][k]表示从0~i之…

java在线找错_平台配置及测试错误提示及解决方案

平台配置错误提示及解决方案开发者在点击提交服务的时候可能会遇到以下各种各样的问题,本文列举出部分平台会弹出的提示,以便解决提交出现的问题。1、 请完成分发国家配置原因:未选择分发国家或未保存解决:在配置-发布国家中&…

d3 mysql_javascript – 在d3可视化中访问MySQL数据库

我需要一些关于d3和MySQL的帮助.以下是我的问题:我有数据存储在MySQL中(例如:关键字及其频率).我现在想用d3将其可视化.据我所知,d3需要json文件作为输入.我的问题是:如何从d3脚本访问这个MySQL数据库?我能想到的一种方法是&#…

resteasy_Tomcat 7上具有RESTeasy JAX-RS的RESTful Web服务– Eclipse和Maven项目

resteasy开发Web服务的RESTful方法不断受到越来越多的关注,并且似乎正在将SOAP淘汰。 我不会讨论哪种方法更好,但是我相信我们都同意REST更轻量级。 在本教程中,我将向您展示如何使用RESTeasy开发RESTful服务以及如何将它们部署在Tomcat服务器…

java httpserver 多个接口_多个Servlet之间数据共享实现方案

1.数据共享:OneServlet工作完毕后,将产生数据交给TwoServlet来使用Servlet规范中提供四种数据共享方案1.ServletContext接口2.Cookie类3.HttpSession接口4.HttpServletRequest接口ServletContext接口:1.介绍:1)来自于Servlet规范中一个接口。…

【Java心得总结六】Java容器中——Collection

在【Java心得总结五】Java容器上——容器初探这篇博文中,我对Java容器类库从一个整体的偏向于宏观的角度初步认识了Java容器类库。而在这篇博文中,我想着重对容器类库中的Collection容器做一个着重的探索与总结。 Collection:一个独立元素的序…

php 文章读取_php实现获取文章内容第一张图片的方法

本文实例讲述了php实现获取文章内容第一张图片的方法。分享给大家供大家参考。具体分析如下:采用php获取文章内容的第一张图片方法非常的简单,我们最常用的是使用正则了,感兴趣的朋友可以参考一下下面这段代码。以下是关于选取文章中第一张图…

相对路径

当前程序的所在目录textBox1.Text AppDomain.CurrentDomain.BaseDirectory; 返回D:\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\http://www.cnblogs.com/SissyNong/archive/2009/09/22/1571752.html 当前程序的完整路径textBox1.Text System.Diagnostics.…

php怎么传json数据_php和js如何通过json互相传递数据相关问题探讨

当我们在结合php和javascript实现某些功能时,经常会用到json。json是js的一种数据格式,可以直接被js解析。而php无法直接读取json数据,但是php提供了json_decode函数来对json数据进行转化,从而可以被php脚本访问。同时&#xff0c…

Java 8中的策略模式

这是两个有关如何使用Java 8功能样式以及Cyclops模式匹配和Hamcrest库来实现策略模式设计的示例。 PrintDependingOnInput方法是一种策略,该策略将根据传递的日志在System.println中显示一些消息。 AddPrefix是另一种策略,它将根据邮件内容为邮件添加前…

昨天帮同学的学校写了首校歌

转载于:https://www.cnblogs.com/del/p/3792526.html