Module  java.base
软件包  java.lang.invoke

Class StringConcatFactory



  • public final class StringConcatFactory
    extends Object

    有助于创建String连接方法的方法,可用于有效地连接已知数量的已知类型的参数,可能在类型适配和参数的部分评估之后。 这些方法通常用作invokedynamic调用站点的引导方法 ,以支持Java编程语言的字符串连接功能。

    间接访问由所提供的MethodHandle指定的行为按顺序进行两个阶段:

    1. 当调用此类中的方法时,会发生链接 它们以参数形式描述连接参数的计数和类型,以及可选的String 配方 ,以及参与String连接的常量。 关于接受的食谱形状的细节将在下面进一步描述。 链接可能涉及动态加载实现预期连接行为的新类。 CallSite持有MethodHandle指向精确的级联方法。 连接方法可以在不同的CallSite之间共享,例如,如果链接方法产生它们作为纯函数。
    2. 当所生成的级联方法与精确动态参数调用发生调用 对于单个级联方法,这可能会发生多次。 使用静态参数和调用时提供的任何其他动态参数调用行为MethodHandle引用的方法,如MethodHandle.invoke(Object...)所示

    这个类提供了两种形式的链接方法:一个使用动态参数的简单版本( makeConcat(java.lang.invoke.MethodHandles.Lookup, String, MethodType) )和一个高级版本( makeConcatWithConstants(java.lang.invoke.MethodHandles.Lookup, String, MethodType, String, Object...)使用高级形式捕获常量参数)。高级策略可以产生稍微更好的调用字节码爆炸了运行时存在的字符串连接方法的形状数量,因为这些形状也将包含常量静态参数。

    API Note:

    有一个JVM限制(类文件结构约束):没有方法可以调用超过255个插槽。 这限制了可以传递给引导方法的静态和动态参数的数量。 由于存在使用MethodHandle组合器的潜在串联策略,因此我们需要在参数列表上保留几个空插槽以捕获时间结果。 这就是为什么这个工厂的引导方法不能接受超过200个参数插槽。 在连接中需要超过200个参数插槽的用户将会在较小的表达式中拆分大级连接。

    从以下版本开始:
    9
    • 方法详细信息

      • makeConcat

        public static CallSite makeConcat​(MethodHandles.Lookup lookup,
                                          String name,
                                          MethodType concatType)
                                   throws StringConcatException
        促进创建优化的字符串连接方法,可以用于有效地连接已知数量的已知类型的参数,可能在类型适配和参数的部分评估之后。 通常用作invokedynamic调用站点的引导方法 ,以支持Java编程语言的字符串连接功能。

        当调用从该方法返回的CallSite的目标时,它返回String连接的结果,将传递给链接方法的所有函数参数作为连接的输入。 目标签名由concatType给出。 参数按照JLS 15.18.1“串联连接运算符+”中的要求进行连接。 值得注意的是,输入按照JLS 5.1.11“字符串转换”进行转换,并从左到右组合。

        假设链接参数如下:

        • concatType ,描述CallSite签名

        那么以下链接不变量必须保持:

        • concatType的参数计数小于等于200
        • concatType的返回类型可从String分配
        参数
        lookup - 表示具有调用者的可访问性特权的查找上下文。 当与invokedynamic使用时,由VM自动堆叠。
        name - 要实现的方法的名称。 这个名字是任意的,对于这种链接方法没有意义。 当与invokedynamic使用时,由NameAndTypeInvokeDynamic提供,并由VM自动堆叠。
        concatType -的的预期的签名CallSite 参数类型表示级联参数的类型; 返回类型始终可从String分配。 当与invokedynamic使用时,由NameAndTypeInvokeDynamic提供,并由VM自动堆叠。
        结果
        一个CallSite,其目标可用于执行字符串连接,具有由给定的 concatType描述的动态连接参数。
        异常
        StringConcatException - 如果这里描述的任何链接不变量被违反。
        NullPointerException - 如果任何传入的参数为空。 当使用invokedynamic调用引导方法时,这将永远不会发生。
        See The Java™ Language Specification:
        5.1.11字符串转换,15.18.1字符串连接运算符+
      • makeConcatWithConstants

        public static CallSite makeConcatWithConstants​(MethodHandles.Lookup lookup,
                                                       String name,
                                                       MethodType concatType,
                                                       String recipe,
                                                       Object... constants)
                                                throws StringConcatException
        促进创建优化的字符串连接方法,可以用于有效地连接已知数量的已知类型的参数,可能在类型适配和参数的部分评估之后。 通常用作invokedynamic调用站点的引导方法 ,以支持Java编程语言的字符串连接功能。

        当从该方法返回的CallSite的目标被调用时,它返回String连接的结果,将传递给链接方法的所有函数参数和常量作为连接的输入。 目标签名由concatType给出,不包括常数。 参数按照JLS 15.18.1“串联连接运算符+”中的要求进行连接。 值得注意的是,输入按照JLS 5.1.11“字符串转换”进行转换,并从左到右组合。

        连接配方是从参数和常量构造连接的String的方法的String描述。 配方从左到右处理,每个字符代表连接的输入。 食谱字符意味着:

        • \ 1(Unicode点0001) :一个普通参数。 此输入通过动态参数传递,并在连接方法调用期间提供。 该输入可以为空。
        • \ 2(Unicode点0002):一个常数。 此输入通过静态引导参数。 该常数可以是常量池中可表示的任何值。 如有必要,工厂将致电toString执行一次性字符串转换。
        • 任何其他char值:单个字符常量。

        假设链接参数如下:

        • concatType ,描述CallSite签名
        • recipe ,描述字符串配方
        • constants ,vararg数组的常量

        那么以下链接不变量必须保持:

        • concatType的参数计数小于或等于200
        • concatType的参数计数等于concatType中\ 1标签的recipe
        • concatType的返回类型可从String分配,并匹配返回的返回类型MethodHandle
        • constants的元素constants等于constants的\ 2标签recipe
        API Note:
        代码生成器有三种不同的方式来处理字符串连接表达式中的常量字符串操作数S。 首先,S可以作为参考(使用ldc)实现,并作为普通参数(配方“\ 1”)传递。 或者,S可以存储在常量池中并作为常数传递(配方“\ 2”)。 最后,如果S不包含配方标记字符('\ 1','\ 2'),则S可以内插到配方本身,从而使其字符插入到结果中。
        参数
        lookup - 表示具有调用者的辅助功能权限的查找上下文。 当与invokedynamic使用时,VM将自动堆叠。
        name - 要实现的方法的名称。 这个名字是任意的,对于这种链接方法没有意义。 当与invokedynamic使用时,由NameAndTypeInvokeDynamic提供,并由VM自动堆叠。
        concatType -的的预期的签名CallSite 参数类型表示动态级联参数的类型; 返回类型始终可从String分配。 当与invokedynamic使用时,由NameAndTypeInvokeDynamic提供,并由VM自动堆叠。
        recipe - 连锁配方,如上所述。
        constants - 表示传递给链接方法的常量的vararg参数。
        结果
        一个CallSite,其目标可用于执行字符串连接,具有由给定的 concatType描述的动态连接参数。
        异常
        StringConcatException - 如果这里描述的任何链接不变量被违反。
        NullPointerException - 如果任何传入的参数为空,或者recipe任何常量为空。 当使用invokedynamic调用引导方法时,这将永远不会发生。
        See The Java™ Language Specification:
        5.1.11字符串转换,15.18.1字符串连接运算符+