news 2026/8/30 22:49:29

509. Java 方法句柄 - Lookup 与 MethodType

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
509. Java 方法句柄 - Lookup 与 MethodType

文章目录

  • 509. Java 方法句柄 - Lookup 与 MethodType
    • 1. Lookup —— 方法句柄的工厂
    • 2. MethodType —— 方法签名的描述符
    • 3. 查找不同类型的方法
      • 🔸 查找实例方法:`findVirtual`
      • 🔸 查找静态方法:`findStatic`
      • 🔸 查找构造函数:`findConstructor`
    • 4. 总结 🎓

509. Java 方法句柄 - Lookup 与 MethodType

在使用Method Handles之前,我们需要明确两个核心要素:

  1. Lookup 对象:负责查找方法/字段/构造函数。
  2. MethodType 对象:描述方法的签名(返回值类型 + 参数类型)。

1. Lookup —— 方法句柄的工厂

在创建 Method Handle 时,必须先有一个Lookup 对象
Lookup 决定了你能访问的范围。

  • 只查找公共成员

    MethodHandles.Lookup publicLookup = MethodHandles.publicLookup();

    👉 只能访问public 类中的 public 成员。这样更安全,避免意外暴露私有方法。

  • 完全访问(包括 private/protected)

    MethodHandles.Lookup lookup = MethodHandles.lookup();

    👉 适合在类内部或受信任的范围内使用。但注意:如果这种 lookup 暴露出去,私有方法也可能被间接访问。

📌最佳实践

  • 如果 Method Handle 只在类内部使用,可以放心用lookup()
  • 如果可能被暴露给外部代码,请用publicLookup(),限制只访问公开 API。

2. MethodType —— 方法签名的描述符

MethodType是方法签名的抽象,描述了:

  • 返回值类型(第一个参数)
  • 参数类型(后续参数)

示例:一个返回int、接收String参数的方法签名:

MethodType methodType = MethodType.methodType(int.class, String.class);

这样我们就能告诉 JVM:

“我要找一个返回 int、接收 String 的方法。”


3. 查找不同类型的方法

Lookup 提供不同的查找方式:

🔸 查找实例方法:findVirtual

比如String.replace(char oldChar, char newChar)

MethodHandles.Lookup lookup = MethodHandles.lookup(); MethodType replaceType = MethodType.methodType(String.class, char.class, char.class); MethodHandle replaceHandle = lookup.findVirtual(String.class, "replace", replaceType); String result = (String) replaceHandle.invoke("banana", 'a', 'o'); System.out.println(result); // bonono

👉 第一个参数"banana"是调用该实例方法的对象。


🔸 查找静态方法:findStatic

比如String.valueOf(Object obj)

MethodType valueOfType = MethodType.methodType(String.class, Object.class); MethodHandle valueOfHandle = lookup.findStatic(String.class, "valueOf", valueOfType); String result = (String) valueOfHandle.invoke(12345); System.out.println(result); // "12345"

🔸 查找构造函数:findConstructor

比如new StringBuilder(String str)

MethodType constructorType = MethodType.methodType(void.class, String.class); MethodHandle constructorHandle = lookup.findConstructor(StringBuilder.class, constructorType); StringBuilder sb = (StringBuilder) constructorHandle.invoke("Hello"); System.out.println(sb.toString()); // Hello

4. 总结 🎓

  • Lookup 决定访问范围:安全边界要牢记。
  • MethodType 是“方法签名描述符”:必须精确匹配返回值和参数类型。
  • 三类查找方法
    • findVirtual—— 实例方法
    • findStatic—— 静态方法
    • findConstructor—— 构造函数
  • 调用方式统一methodHandle.invoke(对象, 参数...)

💡 建议在培训时加一个对照表

查找方式示例说明
findVirtualString.replace(char, char)调用实例方法
findStaticString.valueOf(Object)调用静态方法
findConstructornew StringBuilder(String)调用构造方法
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/30 22:48:55

基于ROS2与Nav2的智能扫地机器人自主导航系统实战指南

简介:本资源是一套基于ROS2开发的导航扫地机器人完整工程实现,面向机器人工程、人工智能方向的本科生课程设计与毕业设计实践者,解决自主导航与清扫功能集成这一典型移动机器人应用问题。压缩包共68个文件,含29个Python节点脚本&a…

作者头像 李华
网站建设 2026/8/30 22:48:03

aigc检测工具能测知网论文吗?AI降重结果不能代替查重报告

aigc检测工具能测知网论文吗?AI降重结果不能代替查重报告 页面提供的结果能否说明测了知网论文正确用途标明知网AIGC检测并提供对应报告可以作为相应检测结果仍需确认是否为学校指定入口只给通用AI率不能等同知网结果修改前自查参考返回AI降重处理稿不是检测报告核…

作者头像 李华
网站建设 2026/8/30 22:47:09

基于LSTM的股票预测系统开发:从数据清洗到模型调优全攻略

简介:本资源是一套面向高校计算机、金融工程及人工智能方向学生的LSTM股票价格预测实践方案,聚焦时序建模与量化分析能力培养,适用于课程设计、综合实训或毕业设计选题。压缩包共107个文件(9.44MB),包含24个…

作者头像 李华
网站建设 2026/8/30 22:46:15

NVIDIA 与 Google 联手降低 AI 推理成本

NVIDIA 与 Google 联手降低 AI 推理成本:Vera Rubin、A5X 与超大规模 AI 基础设施 AI 模型越来越强,但真正决定 AI 能否大规模落地的,正在变成另一个问题:运行这些模型到底需要多少成本? 2026 年 4 月,在 Google Cloud Next 大会上,Google 与 NVIDIA 公布了面向大规模 A…

作者头像 李华
网站建设 2026/8/30 22:43:57

AI时代人类定位:从执行者到定义者与判定者的实践指南

过去一年里,我身边越来越多的同事、读者和学员开始问同一个问题:“AI 什么都能写了,那我们到底该做什么?”问这些话的人里有程序员、产品经理、内容编辑、设计师,也有刚准备入行的毕业生。他们的困惑有一个共同点&…

作者头像 李华
网站建设 2026/8/30 22:41:10

基于ROS2的视觉SLAM自主导航系统:从原理到实践

简介:本资源是一套基于ROS2构建的自主导航视觉系统完整工程实现,面向机器人工程、人工智能方向的本科生与研究生,适用于毕业设计、课程设计及科研原型开发。系统融合视觉感知、传感器融合、路径规划与运动控制等关键技术,支持在室…

作者头像 李华