Module jdk.dynalink

Class BeansLinker

java.lang.Object
jdk.dynalink.beans.BeansLinker
所有实现的接口:
GuardingDynamicLinker

public class BeansLinker extends Object implements GuardingDynamicLinker
用于普通Java对象的链接器。通常作为DynamicLinkerFactory的最终回退链接器,因此有机会链接所有其他链接器未识别的对象的调用。具体来说,此链接器将:

自动执行方法重载解析对属性设置器、方法和构造函数进行自动执行。此外,通过在调用站点指定包含显式签名的方法的名称来支持手动方法选择,例如StandardOperation.GET.withNamespace(METHOD).named("parseInt(String,int)")。您可以在此类签名中使用非限定类名,而不考虑这些类的包,它们将与具有相同非限定名称的任何类匹配。只有在非限定类名会导致选择模糊性时,才必须使用完全限定类名(这种情况极为罕见)。构造函数的重载解析不是自动的,因为没有逻辑位置可以附加该功能,但如果语言希望提供此功能,可以使用getConstructorMethod(Class, String)作为其有用的构建块。

可变参数调用对方法和构造函数都进行处理。

调用者敏感方法可以链接,只要它们在其他方面是公共的,并且链接请求具有携带全强度MethodHandles.Lookup对象的调用站点描述符,而不是弱化查找或公共查找。

处理缺少成员的行为可以通过将MissingMemberHandlerFactory传递给constructor来自定义。

该类还公开了各种方法,用于发现类和类实例上可用的属性和方法名称,以及使用getLinkerForClass(Class)方法访问每个类链接器。

  • Constructor Details

    • BeansLinker

      public BeansLinker()
      创建一个新的bean链接器。等效于使用null作为缺少成员处理程序工厂传递给BeansLinker(MissingMemberHandlerFactory),从而导致对链接和评估缺少成员的默认行为。
    • BeansLinker

      public BeansLinker(MissingMemberHandlerFactory missingMemberHandlerFactory)
      使用指定的工厂创建一个新的bean链接器,用于创建缺少成员处理程序。如果默认行为足够,则传递的工厂可以为null。有关详细信息,请参阅MissingMemberHandlerFactory
      参数:
      missingMemberHandlerFactory - 用于创建缺少成员操作处理程序的工厂。
  • Method Details

    • getLinkerForClass

      public TypeBasedGuardingDynamicLinker getLinkerForClass(Class<?> clazz)
      返回特定单个类的bean链接器。当需要覆盖或扩展语言运行时链接器中某些类的链接行为,但仍希望在某些情况下委托给默认行为时,此方法很有用。
      参数:
      clazz - 类
      返回:
      该类的bean链接器
    • isDynamicMethod

      public static boolean isDynamicMethod(Object obj)
      如果对象是Java动态方法(例如,通过Java对象或StaticClass上的GET:METHOD操作或通过getConstructorMethod(Class, String)获得)则返回true。
      参数:
      obj - 我们要测试是否为Java动态方法的对象。
      返回:
      如果是动态方法,则为true;否则为false。
    • isDynamicConstructor

      public static boolean isDynamicConstructor(Object obj)
      如果对象是Java构造函数(通过getConstructorMethod(Class, String)获得)则返回true。
      参数:
      obj - 我们要测试是否为Java构造函数的对象。
      返回:
      如果是构造函数,则为true;否则为false。
    • getConstructorMethod

      public static Object getConstructorMethod(Class<?> clazz, String signature)
      返回给定类的构造函数的动态方法和给定签名。此方法对于基于显式签名选择重载构造函数的功能很有用,因为Dynalink未以其他方式公开此功能,StaticClass对象充当没有显式签名选择的重载构造函数。示例用法为:getConstructorMethod(java.awt.Color.class, "int, int, int")
      参数:
      clazz - 类
      signature - 构造函数的完整签名。请注意,您可以使用原始类型的名称、使用正常Java表示法的数组名称(例如"int[]")以及通常您甚至可以使用非限定类名(例如"String, List"而不是"java.lang.String, java.util.List",只要它们不会在特定参数位置上引起歧义。
      返回:
      构造函数的动态方法,如果不存在具有指定签名的构造函数,则返回null。
    • getReadableInstancePropertyNames

      public static Set<String> getReadableInstancePropertyNames(Class<?> clazz)
      返回类的所有可读实例属性的名称集。
      参数:
      clazz - 类
      返回:
      类的所有可读实例属性的名称集。
    • getWritableInstancePropertyNames

      public static Set<String> getWritableInstancePropertyNames(Class<?> clazz)
      返回类的所有可写实例属性的名称集合。
      参数:
      clazz - 类
      返回:
      类的所有可写实例属性的名称集合。
    • getInstanceMethodNames

      public static Set<String> getInstanceMethodNames(Class<?> clazz)
      返回类的所有实例方法的名称集合。
      参数:
      clazz - 类
      返回:
      类的所有实例方法的名称集合。
    • getReadableStaticPropertyNames

      public static Set<String> getReadableStaticPropertyNames(Class<?> clazz)
      返回类的所有可读静态属性的名称集合。
      参数:
      clazz - 类
      返回:
      类的所有可读静态属性的名称集合。
    • getWritableStaticPropertyNames

      public static Set<String> getWritableStaticPropertyNames(Class<?> clazz)
      返回类的所有可写静态属性的名称集合。
      参数:
      clazz - 类
      返回:
      类的所有可写静态属性的名称集合。
    • getStaticMethodNames

      public static Set<String> getStaticMethodNames(Class<?> clazz)
      返回类的所有静态方法的名称集合。
      参数:
      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 - 如果由于任何原因操作失败