MethodHandle(方法句柄)系列之二:方法句柄的简单使用
2015-04-09 00:02
435 查看
二话不说,上代码
代码输出结果均为el。
接下来说一下方法句柄的调用过程,首先,在获取方法句柄之前,先通过MethodType的静态工厂方法,先生成一个包含方法参数类型、方法返回类型的的方法类型,也就是
/** * *@authorLiuYeFeng<897908343@qq.com> *@date2015年4月8日下午10:41:13 *@CopyRight2015TopViewInc *@versionV1.0 */ publicclassMethodHandleTest{ publicMethodHandlegetHandler(){ MethodHandlemh=null; MethodTypemt=MethodType.methodType(String.class,int.class,int.class); MethodHandles.Lookuplk=MethodHandles.lookup(); try{ mh=lk.findVirtual(String.class,"substring",mt); }catch(Throwablee){ e.printStackTrace(); } returnmh; } publicstaticvoidmain(String[]args)throwsThrowable{ MethodHandlemh=newMethodHandleTest().getHandler(); Stringstr="helloworld"; Objectresult1=mh.invoke(str,1,3); Objectresult2=(String)mh.invokeExact(str,1,3); //Objectresult2=mh.invokeExact(str,newInteger(1),3); /** *上面这句方法执行时报错,因为方法类型为String.class,int.class,int.class *而返回的类型为Object,与声明中为String不符合 *其中第二个参数类型为Integer,与声明中为int不符合,则类型适配不符合,系统报错。 */ System.out.println("result1:"+result1); System.out.println("result1:"+result2); } }
代码输出结果均为el。
接下来说一下方法句柄的调用过程,首先,在获取方法句柄之前,先通过MethodType的静态工厂方法,先生成一个包含方法参数类型、方法返回类型的的方法类型,也就是
MethodTypemt=MethodType.methodType(String.
class
,
int
.
class
,
int
.
class
)。
其次,获取方法句柄要用到Lookup对象,比如代码中的MethodHandles.Lookuplk,这个对象可以提供其所在环境中任何可见方法的方法句柄。我们可以将其比喻成包含有某个类对象的方法成员、方法的容器,通过lk.findVirtual(String.
class
,
"substring"
,mt);
具体锁定String类型中的某个方法,作为方法句柄返回。要从lookup对象中得到方法句柄,需要给出持有所需方法的类,方法的名称,以及跟方法相匹配的方法类型。
最后,获取到方法句柄后,我们就可以通过方法句柄来调用底层的方法,这点上,跟反射中的方法调用类似。方法句柄提供两个方法调用底层方法,invoke和invokeExact方法。invokeExact方法与直接调用底层方法是一样的,比如代码中,mh.invoke(str,1,2)就相当于直接调用str.substring(1,3);具体两个方法的区别下面再说。这里先解析一下这两个方法的调用,方法的调用参数基本都一样,第一个参数为方法的接受对象,即是哪个对象执行这个方法,接下来的参数就是执行方法所需要的参数。当然第一个参数,也就是方法的接受对象,可以通过方法句柄的bindto动态的参数绑定方法来绑定,从而使方法句柄的调用和普通方法调用没区别,动态的参数绑定我们以后再研究。
这里需要强调一下,静态方法和动态方法之间的差别,静态方法是不需要制定方法的接受对象的,而一般方法是需要的。
参考资料:《java程序员修炼之道》、《深入理解java7核心技术与最佳实践》
相关文章推荐
- MethodHandle(方法句柄)系列之三:invoke和invokeExact的区别
- java7新特性之方法句柄MethodHandle使用
- MethodHandle(方法句柄)系列之一:MethodHandle和MethodType
- MySQL---数据库从入门走向大神系列(七)-Java访问数据库配置及简单使用方法execute
- Ollydbg使用教程系列-中断方法浅探
- javadoc 命令的简单使用方法
- linux file.src.rpm 使用方法的简单介绍
- web.config文件自定义配置节的使用方法的一个简单例子
- Linux学习随手记(1) find命令的最简单的使用方法
- 关于存储过程中一个参数表示多个查询条件使用方法的简单处理
- 简单SharpZipLib使用方法
- 最简单的方法在DataGrid中自定义样式列(通过继承可以在Datagrid中使用下拉列表框,日期控件等)
- ASP.NET AJAX入门系列(10):Timer控件简单使用
- 在.NET2.0中如何更简单的使用委托将方法加载到事件中去
- 在ASP.NET中使用AJAX的简单方法
- 深入Atlas系列:Web Sevices Access in Atlas示例(3) - 在Web Services方法中使用多态
- 不让别人使用某个软件的方法?非常简单
- 使用简单的方法进行批量删除数据
- doxygen无法使用dot简单解决方法
- 深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET调用Web Services方法