java.lang.Object
jdk.dynalink.beans.BeansLinker
- 所有实现的接口:
-
GuardingDynamicLinker
用于普通Java对象的链接器。通常作为
DynamicLinkerFactory的最终回退链接器,因此有机会链接所有其他链接器未识别的对象的调用。具体来说,此链接器将:
- 如果对象是一个
record,则将记录组件的所有公共访问器公开为StandardOperation.GET操作的属性获取器,位于StandardNamespace.PROPERTY命名空间中; - 将形式为
setXxx()、getXxx()和isXxx()的所有公共方法公开为StandardOperation.SET和StandardOperation.GET操作的属性设置器和获取器,位于StandardNamespace.PROPERTY命名空间中,除了已由记录组件获取器处理名称的属性的获取器; - 将检索的所有公共方法公开为
StandardOperation.GET操作的方法命名空间中的方法;然后可以使用StandardOperation.CALL调用这些方法。 - 将所有公共字段公开为属性,除非具有相同名称的属性的获取器或设置器;
- 将本地Java数组、
List和Map对象的元素公开为StandardOperation.GET和StandardOperation.SET操作,位于StandardNamespace.ELEMENT命名空间中; - 将
List和Map对象的元素移除公开为StandardOperation.REMOVE操作,位于StandardNamespace.ELEMENT命名空间中; - 在Java数组、
Collection和Map对象上公开名为length的虚拟属性; - 将
StandardOperation.NEW公开为StaticClass实例上的构造函数调用,包括表示Java数组的静态类对象(它们的构造函数接受一个表示要创建的数组长度的int参数); - 以类似的方式公开类的静态方法、字段和属性,如何公开实例方法、字段和属性,对
StaticClass对象。 - 在
Class实例上公开名为static的虚拟属性,以访问它们的StaticClass。
自动执行方法重载解析对属性设置器、方法和构造函数进行自动执行。此外,通过在调用站点指定包含显式签名的方法的名称来支持手动方法选择,例如StandardOperation.GET.withNamespace(METHOD).named("parseInt(String,int)")。您可以在此类签名中使用非限定类名,而不考虑这些类的包,它们将与具有相同非限定名称的任何类匹配。只有在非限定类名会导致选择模糊性时,才必须使用完全限定类名(这种情况极为罕见)。构造函数的重载解析不是自动的,因为没有逻辑位置可以附加该功能,但如果语言希望提供此功能,可以使用getConstructorMethod(Class, String)作为其有用的构建块。
可变参数调用对方法和构造函数都进行处理。
调用者敏感方法可以链接,只要它们在其他方面是公共的,并且链接请求具有携带全强度MethodHandles.Lookup对象的调用站点描述符,而不是弱化查找或公共查找。
处理缺少成员的行为可以通过将MissingMemberHandlerFactory传递给constructor来自定义。
该类还公开了各种方法,用于发现类和类实例上可用的属性和方法名称,以及使用getLinkerForClass(Class)方法访问每个类链接器。
-
Constructor Summary
ConstructorsConstructorDescription创建一个新的bean链接器。BeansLinker(MissingMemberHandlerFactory missingMemberHandlerFactory) 使用指定的工厂创建一个新的bean链接器,用于创建缺少成员处理程序。 -
Method Summary
Modifier and TypeMethodDescriptionstatic 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对象或StaticClass上的GET:METHOD操作或通过getConstructorMethod(Class, String)获得)则返回true。
-
Constructor Details
-
BeansLinker
public BeansLinker()创建一个新的bean链接器。等效于使用null作为缺少成员处理程序工厂传递给BeansLinker(MissingMemberHandlerFactory),从而导致对链接和评估缺少成员的默认行为。 -
BeansLinker
使用指定的工厂创建一个新的bean链接器,用于创建缺少成员处理程序。如果默认行为足够,则传递的工厂可以为null。有关详细信息,请参阅MissingMemberHandlerFactory。- 参数:
-
missingMemberHandlerFactory- 用于创建缺少成员操作处理程序的工厂。
-
-
Method Details
-
getLinkerForClass
返回特定单个类的bean链接器。当需要覆盖或扩展语言运行时链接器中某些类的链接行为,但仍希望在某些情况下委托给默认行为时,此方法很有用。- 参数:
-
clazz- 类 - 返回:
- 该类的bean链接器
-
isDynamicMethod
如果对象是Java动态方法(例如,通过Java对象或StaticClass上的GET:METHOD操作或通过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- 如果由于任何原因操作失败
-