速览Java 7 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

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

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

相关文章

习题6-4 使用函数输出指定范围内的Fibonacci数 (20 分)

本题要求实现一个计算Fibonacci数的简单函数&#xff0c;并利用其实现另一个函数&#xff0c;输出两正整数m和n&#xff08;0<m≤n≤10000&#xff09;之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和&#xff08;最开始两项均定义为1&#xff09;…

SmartGWT入门,提供出色的GWT界面

SmartGWT简介 我最近开始使用SmartGWT &#xff0c;它是一个基于GWT的框架&#xff0c;该框架为您的应用程序UI提供了一个全面的小部件库&#xff0c;并为服务器端的数据管理提供了帮助。 您可以在SmartGWT展示柜上查看其漂亮的功能。 我准备了一个简短的“入门”指南&#xf…

Android OpenGL ES(四)----调整屏幕的宽高比

1.宽高比问题 我们现在相当熟悉这样一个事实&#xff0c;在OpenGL里&#xff0c;我们要渲染的一切物体都要映射到X轴和Y轴上[-1&#xff0c;1]的范围内&#xff0c;对于Z轴也一样。这个范围内的坐标被称为归一化设备坐标&#xff0c;其独立于屏幕实际尺寸或形状。 不幸的是&…

使用Spring AOP进行面向方面的编程

面向方面的编程&#xff08;AOP&#xff09;是指将辅助功能或支持功能与主程序的业务逻辑隔离开来的编程范例。 AOP是用于分离横切关注点的有前途的技术&#xff0c;这在面向对象的编程中通常很难做到。 以此方式增加了应用程序的模块化&#xff0c;并且维护变得非常容易。 横切…

面试题24 二叉搜索树的后序遍历序列

题目描述 输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。1 class Solution {2 public:3 bool VerifySquenceOfBST(vector<int> sequence) {4 if (seque…

习题6-5 使用函数验证哥德巴赫猜想 (20 分)

本题要求实现一个判断素数的简单函数&#xff0c;并利用该函数验证哥德巴赫猜想&#xff1a;任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数。注意&#xff1a;1不是素数&#xff0c;2是素数。 函数接口定义&#xff1a; int prime( int…

Linux学习笔记 (六)用户管理命令

一、用户帐号 1、超级用户&#xff1a;具有操作系统中的最高权限&#xff0c;用来管理和维护操作系统。root用户。 2、普通用户&#xff1a;由root用户来创建&#xff0c;在宿主目录中具有完全权限。 3、程序用户&#xff1a;由应用程序添加&#xff0c;维护某个应用程序运行。…

使用Spring Security保护GWT应用程序

在本教程中&#xff0c;我们将看到如何将GWT与Spring的安全模块&#xff08;即Spring Security&#xff09;集成在一起。 我们将看到如何保护GWT入口点&#xff0c;如何检索用户的凭据以及如何记录各种身份验证事件。 此外&#xff0c;我们将实现自定义身份验证提供程序&#x…

用Fragment制作的Tab页面产生的UI重叠问题

本文出处&#xff1a;http://blog.csdn.net/twilight041132/article/details/43812745 在用Fragment做Tab页面&#xff0c;发现有时候进入应用会同时显示多个Tab内容&#xff0c;UI发生重叠。 当应用被强行关闭后&#xff08;通过手机管家软件手动强关&#xff0c;或系统为节省…

习题6-6 使用函数输出一个整数的逆序数 (20 分)

本题要求实现一个求整数的逆序数的简单函数。 函数接口定义&#xff1a; int reverse( int number );其中函数reverse须返回用户传入的整型number的逆序数。 我的代码&#xff1a; int reverse( int number ) {int n number,res 0,t 0;n (n>0)?n:-n;while(n ! 0){t…

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

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

appcmd命令导入导出站点与应用程序池

在IIS7上导出所有应用程序池的方法: %windir%\system32\inetsrv\appcmd list apppool /config /xml > c:\apppools.xml 这个命令会将服务器上全部的应用程序池都导出来,但有些我们是我们不需要的,要将他们删掉.比如: DefaultAppPoolClassic .Net AppPool如果在导入时发现同名…

卸载apache

1、运行services.msc&#xff0c;在服务中停止 apache 服务。2、运行命令行程序&#xff0c;输入 sc delete apache&#xff0c;删除该服务3、删除apache文件夹。转载于:https://www.cnblogs.com/jiangjieqim/p/5357950.html

使用wowza和xuggler将RTMP转换为RTSP

注意&#xff1a;这是我们的“ Xuggler开发教程 ”系列的一部分。 大家好&#xff01; 在过去的三个月中&#xff0c;我们一直在进行电话会议项目。 我们认为&#xff0c;使用诸如Flex之类的技术的基于Web的应用程序将是此类要求苛刻的项目的最佳方法。 随着软件的复杂性和电信…

如何设置网页标题图标

1、先制作一个名为favicon.ico的小图标&#xff0c;并将其放到网站根目录下 2、在html页面<head></head>标签内加入&#xff1a; <link rel"shortcut icon" href"favicon.ico" />OK转载于:https://www.cnblogs.com/moshengr/p/4600281.h…

C语言pow函数的精度问题

&#xff08;1&#xff09;pow函数返回值是double类型 &#xff08;2&#xff09;pow原型 double pow(double x,double y); (3)sqrt原型 double sqrt(double x); 当输出时函数值赋给整型就会出错&#xff1a; int main()d {int N 1;scanf("%d",&N);for(int i …

习题2-1 求整数均值 (10 分)

吐槽一下&#xff0c;因为少打了一个空格&#xff0c;PTA上老是不给我过&#xff0c;还一直报结果错误&#xff0c;误导我好久&#xff0c;即使是吹毛求疵&#xff0c;也应该提示我格式错误吧&#xff01;&#xff01; 原题&#xff1a; 本题要求编写程序&#xff0c;计算4个整…

iframe高度自适应,终于解决了

一直被iframe的高度自适应的问题困扰着&#xff0c;在项目中也是多次遇到。网上也有不少相关的代码&#xff0c;但是总不能满足自己的要求。在头痛了几次之后终于下定决心解决这个问题。 本代码主要解决的问题是&#xff1a;最外层滚动条随着iframe高度动态变化的问题。如果ifr…

在领域驱动的设计,贫乏的领域模型,代码生成,依赖项注入等方面……

埃里克埃文斯&#xff08;Eric Evans&#xff09;已制定了什么是域驱动设计&#xff08;DDD&#xff09;。 Martin Fowler是DDD的大力支持者和拥护者。 这些都是非凡的名字&#xff0c;几乎可以肯定的是&#xff0c;他们正在支持一些有价值的东西。 我不是在这里对此争论。 也许…

Javascript模块化工具require.js教程

转自&#xff1a;http://www.w3cschool.cc/w3cnote/requirejs-tutorial-1.html, http://www.w3cschool.cc/w3cnote/requirejs-tutorial-2.html 随着网站功能逐渐丰富&#xff0c;网页中的js也变得越来越复杂和臃肿&#xff0c;原有通过script标签来导入一个个的js文件这种方式已…