MethodHandle
2024-09-29 21:18:23
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
最新文章
- CodeFirst时使用T4模板(你肯定没用过的笨方法,还望园友指教)
- iOS 限制TextField输入长度(标准)
- 在线程中调用SaveFileDialog
- 廖雪峰js教程笔记3
- BZOJ4426 : [Nwerc2015]Better Productivity最大生产率
- varchar类型转换为numeric的值时有问题原因
- studio adb连接不上手机 ADB server didn&#39;t ACK
- java多线程的使用1
- table tr分离并加圆角和阴影
- google yeoman
- zabbix图中出现中文乱码问题
- python之scrapy入门教程
- GDI+ 应用,Release没有错误,Debug很多。
- IOC容器在web容器中初始化过程——(二)深入理解Listener方式装载IOC容器方式
- hue集成hbase出现TSocket read 0 bytes
- 《Linux内核设计与分析》第十七章读书笔记
- Practice5.1 测试与封装5.1
- 不偏移的天地图地图服务-SuperMap版
- php 文件压缩
- Git Diff 格式分析