DeepSeek java.lang.constant.DirectMethodHandleDesc.Kind
·
java.lang.constant.DirectMethodHandleDesc.Kind 是 Java 12 引入的一个 枚举类,用于描述可以直接在常量池中表示的方法句柄(MethodHandle)的不同种类。
简单来说,它定义了一个方法句柄“是什么类型”以及“如何被调用”。
1. Kind 枚举常量详解
这个枚举包含了所有可能的直接方法句柄类型,主要分为普通类方法、接口方法、构造函数和字段访问器四大类。
| 枚举常量 | 对应 refKind 值 |
isInterface |
描述 |
|---|---|---|---|
STATIC |
6 (REF_invokeStatic) |
false |
普通类的静态方法调用 |
INTERFACE_STATIC |
6 (REF_invokeStatic) |
true |
接口的静态方法调用 |
VIRTUAL |
5 (REF_invokeVirtual) |
false |
普通类的实例方法调用(多态) |
INTERFACE_VIRTUAL |
9 (REF_invokeInterface) |
true |
接口的实例方法调用 |
SPECIAL |
7 (REF_invokeSpecial) |
false |
普通类的实例方法调用(非虚,如私有方法、超类方法) |
INTERFACE_SPECIAL |
7 (REF_invokeSpecial) |
true |
接口的实例方法调用(非虚,如超接口方法) |
CONSTRUCTOR |
8 (REF_newInvokeSpecial) |
false |
构造函数 |
GETTER |
1 (REF_getField) |
false |
实例字段的读取方法 |
SETTER |
2 (REF_putField) |
false |
实例字段的写入方法 |
STATIC_GETTER |
3 (REF_getStatic) |
false |
静态字段的读取方法 |
STATIC_SETTER |
4 (REF_putStatic) |
false |
静态字段的写入方法 |
2. 核心字段
每个枚举实例包含两个关键字段:
refKind:一个int值,对应java.lang.invoke.MethodHandleInfo中定义的引用 kind(如REF_invokeVirtual= 5)。isInterface:一个boolean值,指示该方法是否在接口中声明。
3. 主要用途和常用方法
这个枚举主要在 java.lang.constant 包中使用,用于构建方法句柄的名义描述符(nominal descriptors),这在编译时或高级字节码操作(如生成 invokedynamic 指令)中非常有用。
a) 获取 Kind 实例
你可以通过两种方式获取 Kind 实例:
// 1. 通过 refKind (对于接口和非接口的歧义情况,默认视为非接口)
DirectMethodHandleDesc.Kind kind1 = DirectMethodHandleDesc.Kind.valueOf(6); // 返回 STATIC
// 2. 通过 refKind 和 isInterface 明确指定
DirectMethodHandleDesc.Kind kind2 = DirectMethodHandleDesc.Kind.valueOf(6, true); // 返回 INTERFACE_STATIC
b) 创建方法句柄描述符
Kind 常用于创建 DirectMethodHandleDesc 实例:
// 创建一个描述 "String::length" 方法的方法句柄
ClassDesc stringClass = ClassDesc.of("java.lang.String");
MethodHandleDesc lengthHandle = MethodHandleDesc.ofMethod(
DirectMethodHandleDesc.Kind.VIRTUAL, // 调用类型
stringClass, // 所属类
"length", // 方法名
MethodTypeDesc.of(ClassDesc.of("int")) // 方法类型 (无参数,返回int)
);
// 创建一个描述 "System.out" 字段的 getter
ClassDesc systemClass = ClassDesc.of("java.lang.System");
ClassDesc printStreamClass = ClassDesc.of("java.io.PrintStream");
MethodHandleDesc outGetter = MethodHandleDesc.ofField(
DirectMethodHandleDesc.Kind.STATIC_GETTER, // 静态字段读取
systemClass, // 所属类
"out", // 字段名
printStreamClass // 字段类型
);
4. 使用场景
这个 API 主要用于:
- 库和框架开发:如 Spring、Hibernate 等需要在运行时生成字节码的框架。
- 编译器和工具链:如 Java 编译器本身、字节码操作库(ASM、ByteBuddy)。
- 高级语言特性:支持
invokedynamic指令,这是 Lambda 表达式、字符串拼接等功能的底层实现基础。
如果你正在处理 Java 类文件、动态语言支持或高级字节码生成,这个枚举会是构建方法句柄描述符的基础构件。
更多推荐

所有评论(0)