Java StringConcatFactory中的策略

Java StringConcatFactory中的策略,java,string-concatenation,java-9,Java,String Concatenation,Java 9,我知道invokedynamic指令 我也知道它是如何实现的基本过程。但当我到达密码。我无法理解StringConcatFactory中的代码 你能告诉我这六种策略是如何通过源代码实现的吗。只执行默认策略。作为一名大学生,我无法理解源代码 private enum Strategy { /** * Bytecode generator, calling into {@link java.lang.StringBuilder}. */ BC_SB, /

我知道invokedynamic指令

我也知道它是如何实现的基本过程。但当我到达密码。我无法理解
StringConcatFactory
中的代码

你能告诉我这六种策略是如何通过源代码实现的吗。只执行默认策略。作为一名大学生,我无法理解源代码

private enum Strategy {
    /**
     * Bytecode generator, calling into {@link java.lang.StringBuilder}.
     */
    BC_SB,

    /**
     * Bytecode generator, calling into {@link java.lang.StringBuilder};
     * but trying to estimate the required storage.
     */
    BC_SB_SIZED,

    /**
     * Bytecode generator, calling into {@link java.lang.StringBuilder};
     * but computing the required storage exactly.
     */
    BC_SB_SIZED_EXACT,

    /**
     * MethodHandle-based generator, that in the end calls into {@link java.lang.StringBuilder}.
     * This strategy also tries to estimate the required storage.
     */
    MH_SB_SIZED,

    /**
     * MethodHandle-based generator, that in the end calls into {@link java.lang.StringBuilder}.
     * This strategy also estimate the required storage exactly.
     */
    MH_SB_SIZED_EXACT,

    /**
     * MethodHandle-based generator, that constructs its own byte[] array from
     * the arguments. It computes the required storage exactly.
     */
    MH_INLINE_SIZED_EXACT
}
makeConcat()
makeConcatWithConstants()
,它们都是
StringConcatFactory
API入口点,都使用
doStringConcat()

doStringConcat()
调用
generate(Lookup,String,MethodType,Recipe)
,它在您询问的枚举上包含以下开关:

switch (STRATEGY) {
    case BC_SB:
        return StringConcatFactory.BytecodeStringBuilderStrategy.generate(lookup, className, mt, recipe, StringConcatFactory.Mode.DEFAULT);
    case BC_SB_SIZED:
        return StringConcatFactory.BytecodeStringBuilderStrategy.generate(lookup, className, mt, recipe, StringConcatFactory.Mode.SIZED);
    case BC_SB_SIZED_EXACT:
        return StringConcatFactory.BytecodeStringBuilderStrategy.generate(lookup, className, mt, recipe, StringConcatFactory.Mode.SIZED_EXACT);
    case MH_SB_SIZED:
        return StringConcatFactory.MethodHandleStringBuilderStrategy.generate(mt, recipe, StringConcatFactory.Mode.SIZED);
    case MH_SB_SIZED_EXACT:
        return StringConcatFactory.MethodHandleStringBuilderStrategy.generate(mt, recipe, StringConcatFactory.Mode.SIZED_EXACT);
    case MH_INLINE_SIZED_EXACT:
        return StringConcatFactory.MethodHandleInlineCopyStrategy.generate(mt, recipe);
    default:
        throw new StringConcatException("Concatenation strategy " + STRATEGY + " is not implemented");
}
  • BytecodeStringBuilderStrategy
    处理
    BC\u SB
    BC\u SB\u大小
    BC\u SB\u大小
    。它生成的
    StringBuilder
    ——使用的字节码与
    javac
    生成的字节码相同,如果您只是在Java代码中编写串联。主要区别在于,此字节码是在运行时(而不是编译时)生成的,并使用
    Unsafe.defineAnonymousClass()
    加载
  • MethodHandleStringBuilderStrategy
    处理
    MH_SB_大小
    MH_SB_大小
    。它使用
    MethodHandle
    机制(包括
    MethodHandle
    composition)在
    StringBuilder
    调用之上构建相同的连接链。它不使用任何私有API(比如
    不安全的
    ),因此它可能是最不可移植的策略
  • MethodHandleInlineCopyStrategy
    处理
    MH\u INLINE\u size\u EXACT
    。它还使用
    MethodHandle
    机制构建带有
    MethodHandle
    组合的级联链,但它不是直接使用字节数组,而是尽可能避免复制。为此,它使用了一些内部API和一些关于JDK实现细节的知识(比如避免复制字符串字节的
    String
    constructor)。因此,这个实现更脆弱(对于JDK更改),但它也允许更高的速度
  • 小结 我们可以看到这三种方法在两个方面有所不同:a)使用什么作为缓冲区来构建字符串,以及b)如何创建连接链

  • 字节码StringBuilderStrategy
    BC\u SB\u xxx
    )使用
    StringBuilder
    和运行时代码生成
  • MethodHandleStringBuilderStrategy
    MH_SB_xxx
    )使用
    StringBuilder
    MethodHandle
    s
  • methodhandleinlinecopyrategy
    MH\u INLINE\u size\u EXACT
    )使用字节数组和
    MethodHandle
    s