模块 jdk.dynalink

类 BeansLinker

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

public class BeansLinker extends Object implements GuardingDynamicLinker
普通 Java 对象的链接器。通常由 DynamicLinkerFactory 用作最终后备链接器,因此它有机会将调用链接到其他链接器无法识别的所有对象。具体来说,此链接器将:

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) 方法访问每个类的链接器。

  • 构造方法详细信息

    • BeansLinker

      public BeansLinker()
      创建一个新的 bean 链接器。相当于 BeansLinker(MissingMemberHandlerFactory) null 作为缺失成员处理程序工厂传递,导致链接和评估缺失成员的默认行为。
    • BeansLinker

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

    • getLinkerForClass

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

      public static boolean isDynamicMethod(Object  obj)
      如果对象是 Java 动态方法(例如,通过对 Java 对象的 GET:METHOD 操作或 StaticClass 或通过 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 - 如果操作因任何原因失败