Java StringConcatFactory中的策略
我知道invokedynamic指令 我也知道它是如何实现的基本过程。但当我到达密码。我无法理解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, /
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