- java.lang.Object
-
- jdk.dynalink.beans.BeansLinker
-
- All Implemented Interfaces:
-
GuardingDynamicLinker
public class BeansLinker extends Object implements GuardingDynamicLinker
用于普通Java对象的链接器。 通常由DynamicLinkerFactory
用作最终的回退链接器,因此有机会将调用链接到没有其他链接器识别的所有对象。 具体来说,此链接器将:- 公开形式的所有公共方法
setXxx()
,getXxx()
,并isXxx()
的财产getter和setter方法StandardOperation.SET
个StandardOperation.GET
在操作StandardNamespace.PROPERTY
命名空间; - 在
StandardNamespace.METHOD
命名空间中公开StandardOperation.GET
操作的所有公共方法检索; 然后可以使用StandardOperation.CALL
调用如此检索的方法。 - 将所有公共字段公开为属性,除非有相同名称的属性的getter或setter;
- 将本地Java数组的元素,
List
和Map
对象的元素公开为StandardOperation.GET
和StandardOperation.SET
操作在StandardNamespace.ELEMENT
命名空间中; - 在Java数组,
Collection
和Map
对象上公开一个名为length
的虚拟属性; - 暴露
StandardOperation.NEW
上的实例StaticClass
作为调用构造,包括代表Java数组那些静态类对象(它们的构造采取单一int
表示该数组来创建的长度参数); - 暴露静态方法,字段和的类的属性以类似的方式如何实例方法,字段和属性被暴露,在
StaticClass
个对象。 - 公开名为虚拟财产
static
上的实例Class
访问他们StaticClass
。
为属性设置器,方法和构造函数自动执行重载方法分辨率 。 另外,手动重载方法选择通过调用站点指定包含显式签名的方法的名称来支持,例如,
StandardOperation.GET.withNamespace(METHOD).named("parseInt(String,int)")
您可以在这样的签名中使用非限定类名,而不管这些类的包,它们将匹配任何类具有相同的非限定名称。 您只需使用完全限定的类名,以防非合格类名称会导致选择模糊(这是非常罕见的)。 构造函数的重载分辨率不是自动的,因为没有逻辑的地方来附加该功能,但如果语言希望提供此功能,它可以使用getConstructorMethod(Class, String)
作为一个有用的构建块。对方法和构造函数处理变量参数调用 。
呼叫者敏感方法可以链接,只要它们是公共的,并且链接请求具有呼叫站点描述符,携带全强度的
MethodHandles.Lookup
对象,而不是削弱的查找或公共查找。处理缺失成员的行为可以通过传递一个定制
MissingMemberHandlerFactory
至constructor
。该类还公开了各种用于发现类和类实例上的可用属性和方法名称的方法,以及使用
getLinkerForClass(Class)
方法访问每类链接器。
-
-
构造方法摘要
构造方法 Constructor 描述 BeansLinker()
创建一个新的bean连接器。BeansLinker(MissingMemberHandlerFactory missingMemberHandlerFactory)
使用指定的工厂创建一个新的bean连接器来创建缺少的成员处理程序。
-
方法摘要
所有方法 静态方法 接口方法 具体的方法 Modifier and Type 方法 描述 static Object
getConstructorMethod(Class<?> clazz, String signature)
返回给定类的构造函数的动态方法和给定的签名。GuardedInvocation
getGuardedInvocation(LinkRequest request, LinkerServices linkerServices)
在调用站点上创建一个适合于具有指定参数的特定调用的保护调用。static Set<String>
getInstanceMethodNames(Class<?> clazz)
返回一组类的所有实例方法的名称。TypeBasedGuardingDynamicLinker
getLinkerForClass(Class<?> clazz)
返回特定单个类的bean连接器。static Set<String>
getReadableInstancePropertyNames(Class<?> clazz)
返回一组类的所有可读实例属性的名称。static Set<String>
getReadableStaticPropertyNames(Class<?> clazz)
返回一组类的所有可读静态属性的名称。static Set<String>
getStaticMethodNames(Class<?> clazz)
返回类的所有静态方法的一组名称。static Set<String>
getWritableInstancePropertyNames(Class<?> clazz)
返回一组类的所有可写实例属性的名称。static Set<String>
getWritableStaticPropertyNames(Class<?> clazz)
返回一组类的所有可写静态属性的名称。static boolean
isDynamicConstructor(Object obj)
如果对象是Java构造函数(通过getConstructorMethod(Class, String)
获得),则返回true。static boolean
isDynamicMethod(Object obj)
如果对象是Java动态方法(例如,通过Java对象上的GET:METHOD
操作获得的或StaticClass
或通过getConstructorMethod(Class, String)
获取的对象),则返回true。
-
-
-
构造方法详细信息
-
BeansLinker
public BeansLinker()
创建一个新的bean连接器。 相当于BeansLinker(MissingMemberHandlerFactory)
,其中null
作为缺少的成员处理程序工厂传递,导致链接和评估丢失成员的默认行为。
-
BeansLinker
public BeansLinker(MissingMemberHandlerFactory 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 异常
描述从接口GuardingDynamicLinker
复制在调用站点上创建一个适合于具有指定参数的特定调用的保护调用。- Specified by:
-
getGuardedInvocation
在接口GuardingDynamicLinker
- 参数
-
request
- 描述链接特定调用的请求的对象 -
linkerServices
- 链接器服务 - 结果
-
使用适合参数的方法句柄进行保护调用,以及如果失败的触发器将重新链接的保护条件。
如果无法解析调用,则必须返回null。
如果返回的调用是无条件的(实际上很少见),返回值中的guard可以为null。
调用也可以有任何数量的切换点用于链接的异步无效,以及一个描述预期的异常情况的
Throwable
子类,它也触发重新链接(通常情况下,依赖于一个不频繁但预期为ClassCastException
的异常情况更快。评估instanceof
警卫)。 链接器必须使用与链接请求的调用站点描述符中的参数类型相匹配的参数类型进行调用,但不应尝试匹配在调用站点中预期的返回类型,除非可以仅使用既不损失精度的转换也没有大小,见LinkerServices.asTypeLosslessReturn(MethodHandle, MethodType)
进一步解释。 - 异常
-
异常
- 如果由于任何原因操作失败
-
-