java.lang.Object
jdk.dynalink.beans.BeansLinker
- 所有已实现的接口:
GuardingDynamicLinker
普通 Java 对象的链接器。通常由
DynamicLinkerFactory 用作最终后备链接器,因此它有机会将调用链接到其他链接器无法识别的所有对象。具体来说,此链接器将:
- 如果对象是
record,则将记录组件的所有公共访问器公开为StandardNamespace.PROPERTY命名空间中的StandardOperation.GET操作的属性获取器; - 将形式
setXxx()、getXxx()和isXxx()的所有公共方法公开为StandardNamespace.PROPERTY命名空间中StandardOperation.SET和StandardOperation.GET操作的属性设置器和吸气器,除了具有已由记录组件吸气器处理的名称的属性的吸气器; - 在
StandardNamespace.METHOD命名空间中公开所有用于检索StandardOperation.GET操作的公共方法;然后可以使用StandardOperation.CALL调用由此检索到的方法。 - 将所有公共字段公开为属性,除非同名属性有 getter 或 setter;
- 将本机 Java 数组的元素、
List和Map对象公开为StandardNamespace.ELEMENT命名空间中的StandardOperation.GET和StandardOperation.SET操作; - 在
StandardNamespace.ELEMENT命名空间中公开删除List和Map对象的元素作为StandardOperation.REMOVE操作; - 在 Java 数组、
Collection和Map对象上公开一个名为length的虚拟属性; - 在
StaticClass的实例上公开StandardOperation.NEW作为对构造函数的调用,包括那些表示 Java 数组的静态类对象(它们的构造函数采用单个int参数表示要创建的数组的长度); - 在
StaticClass对象上,以与公开实例方法、字段和属性的方式类似的方式公开类的静态方法、字段和属性。 - 在
Class的实例上公开一个名为static的虚拟属性以访问它们的StaticClass。
Overloaded method resolution 为属性设置器、方法和构造函数自动执行。此外,通过让调用站点为包含显式签名的方法指定名称来支持手动重载方法选择,例如 StandardOperation.GET.withNamespace(METHOD).named("parseInt(String,int)") 您可以在此类签名中使用非限定类名称,而不管这些类的包如何,它们将匹配任何类具有相同的非限定名称。您只需使用完全限定的类名,以防非限定类名导致选择歧义(这种情况极为罕见)。构造函数的重载解析不是自动的,因为没有逻辑位置可以附加该功能,但如果一种语言希望提供此功能,它可以使用 getConstructorMethod(Class, String) 作为它的有用构建块。
Variable argument invocation 为方法和构造函数处理。
Caller sensitive methods 可以链接,只要它们在其他方面是公开的,并且链接请求具有携带全强度 MethodHandles.Lookup 对象的调用站点描述符,而不是弱化查找或公共查找。
The behavior for handling missing members 可以通过将 MissingMemberHandlerFactory 传递给 constructor 来自定义。
该类还公开了各种方法,用于发现类和类实例上的可用属性和方法名称,以及使用 getLinkerForClass(Class) 方法访问每个类的链接器。
-
构造方法总结
构造方法构造方法描述创建一个新的 bean 链接器。BeansLinker(MissingMemberHandlerFactory missingMemberHandlerFactory) 使用指定的工厂创建一个新的 beans 链接器,用于创建缺少的成员处理程序。 -
方法总结
修饰符和类型方法描述static ObjectgetConstructorMethod(Class<?> clazz, String signature) 返回给定类和给定签名的构造方法的动态方法。getGuardedInvocation(LinkRequest request, LinkerServices linkerServices) 在调用站点使用指定参数创建适用于特定调用的受保护调用。getInstanceMethodNames(Class<?> clazz) 返回类的所有实例方法的一组名称。getLinkerForClass(Class<?> clazz) 返回特定单个类的 bean 链接器。getReadableInstancePropertyNames(Class<?> clazz) 返回类的所有可读实例属性的一组名称。getReadableStaticPropertyNames(Class<?> clazz) 返回类的所有可读静态属性的一组名称。getStaticMethodNames(Class<?> clazz) 返回一个类的所有静态方法的一组名称。getWritableInstancePropertyNames(Class<?> clazz) 返回类的所有可写实例属性的一组名称。getWritableStaticPropertyNames(Class<?> clazz) 返回类的所有可写静态属性的一组名称。static boolean如果对象是 Java 构造函数(通过getConstructorMethod(Class, String)获得),则返回 true。static booleanisDynamicMethod(Object obj) 如果对象是 Java 动态方法(例如,通过对 Java 对象的GET:METHOD操作或StaticClass或通过getConstructorMethod(Class, String)获得的方法),则返回 true。
-
构造方法详细信息
-
BeansLinker
public BeansLinker()创建一个新的 bean 链接器。相当于BeansLinker(MissingMemberHandlerFactory)和null作为缺失成员处理程序工厂传递,导致链接和评估缺失成员的默认行为。 -
BeansLinker
使用指定的工厂创建一个新的 beans 链接器,用于创建缺少的成员处理程序。如果默认行为足够,则传递的工厂可以为 null。有关详细信息,请参阅MissingMemberHandlerFactory。- 参数:
missingMemberHandlerFactory- 一个为缺少成员的操作创建处理程序的工厂。
-
-
方法详情
-
getLinkerForClass
返回特定单个类的 bean 链接器。当您需要重写或扩展语言运行时链接器中某些类的链接行为,但在某些情况下仍想委托默认行为时很有用。- 参数:
clazz- 类- 返回:
- 该类的 bean 链接器
-
isDynamicMethod
如果对象是 Java 动态方法(例如,通过对 Java 对象的GET:METHOD操作或StaticClass或通过getConstructorMethod(Class, String)获得的方法),则返回 true。- 参数:
obj- 我们要测试的对象是否为 Java 动态方法。- 返回:
- 如果它是动态方法,则为 true,否则为 false。
-
isDynamicConstructor
如果对象是 Java 构造函数(通过getConstructorMethod(Class, String)获得),则返回 true。- 参数:
obj- 我们要测试的对象是否为 Java 构造函数。- 返回:
- 如果它是构造方法,则为 true,否则为 false。
-
getConstructorMethod
返回给定类和给定签名的构造函数的动态方法。此方法对于公开基于显式签名选择重载构造函数的功能很有用,因为 Dynalink 不会以其他方式公开此功能,因为StaticClass对象充当没有显式签名选择的重载构造函数。示例用法为:getConstructorMethod(java.awt.Color.class, "int, int, int")。- 参数:
clazz- 类signature- 构造函数的完整签名。请注意如何使用基本类型的名称、具有普通 Java 符号的数组名称(例如"int[]"),通常您甚至可以使用非限定类名称(例如"String, List"而不是"java.lang.String, java.util.List"只要它们不会在特定参数位置引起歧义.- 返回:
- 构造方法的动态方法,如果不存在具有指定签名的构造方法,则返回 null。
-
getReadableInstancePropertyNames
返回类的所有可读实例属性的一组名称。- 参数:
clazz- 类- 返回:
- 类的所有可读实例属性的一组名称。
-
getWritableInstancePropertyNames
返回类的所有可写实例属性的一组名称。- 参数:
clazz- 类- 返回:
- 类的所有可写实例属性的一组名称。
-
getInstanceMethodNames
返回类的所有实例方法的一组名称。- 参数:
clazz- 类- 返回:
- 类的所有实例方法的一组名称。
-
getReadableStaticPropertyNames
返回类的所有可读静态属性的一组名称。- 参数:
clazz- 类- 返回:
- 类的所有可读静态属性的一组名称。
-
getWritableStaticPropertyNames
返回类的所有可写静态属性的一组名称。- 参数:
clazz- 类- 返回:
- 类的所有可写静态属性的一组名称。
-
getStaticMethodNames
返回一个类的所有静态方法的一组名称。- 参数:
clazz- 类- 返回:
- 一个类的所有静态方法的一组名称。
-
getGuardedInvocation
public GuardedInvocation getGuardedInvocation(LinkRequest request, LinkerServices linkerServices) throws Exception 从接口GuardingDynamicLinker复制的描述在调用站点使用指定参数创建适用于特定调用的受保护调用。- 指定者:
getGuardedInvocation在接口GuardingDynamicLinker中- 参数:
request- 描述链接特定调用请求的对象linkerServices- 链接器服务- 返回:
-
带有适合参数的方法句柄的受保护调用,以及如果失败应触发重新链接的保护条件。如果无法解析调用,则必须返回 null。如果返回的调用是无条件的(这实际上很少见),则返回值中的守卫可以为 null。调用也可以有任意数量的开关点用于链接的异步失效,以及一个
Throwable子类,它描述了一个预期的异常条件,它也会触发重新链接(通常依赖一个不常见但预期的ClassCastException比总是更快评估了instanceof守卫)。虽然链接器必须生成一个调用,其参数类型与链接请求的调用站点描述符中的参数类型相匹配,但它不应尝试匹配调用站点预期的返回类型,除非它可以仅通过不丢失任何精度的转换来实现也不是幅度,请参阅LinkerServices.asTypeLosslessReturn(MethodHandle, MethodType)以获取更多说明。 - 抛出:
Exception- 如果操作因任何原因失败
-