クラス CodeFlow
- 実装されているすべてのインターフェース:
Opcodes
ネストされたクラスの要約
ネストされたクラス修飾子と型クラス説明static interfaceclinit静的初期化ブロックを生成するために使用されるインターフェース。static interfaceフィールドの生成に使用されるインターフェース。フィールドのサマリー
インターフェース Opcodes から継承されたフィールド
AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_RECORD, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM10_EXPERIMENTAL, ASM4, ASM5, ASM6, ASM7, ASM8, ASM9, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V9コンストラクターの概要
コンストラクターメソッドのサマリー
修飾子と型メソッド説明static booleanareBoxingCompatible(StringSE desc1, StringSE desc2) ボクシング / アンボクシングが 1 つの型から別の型に移行できるかどうかを決定します。static intarrayCodeFor(StringSE arrayType) NEWARRAY バイトコードに使用する適切な T タグを決定します。static StringSEcreateSignatureDescriptor(ConstructorSE<?> ctor) コンストラクターの JVM シグニチャー記述子を作成します。static StringSEcreateSignatureDescriptor(MethodSE method) メソッドの JVM シグニチャー記述子を作成します。void通常、ネストされた式の評価により、新しいコンパイルスコープを入力します。void通常、ネストされた式が評価された後で、コンパイルスコープを終了します。voidfinish()メインの式評価メソッドが生成された後に呼び出されるこのメソッドは、登録されている FieldAdders または ClinitAdders をコールバックして、コンパイルされた式を表すクラスに追加情報を追加します。voidgenerateCodeForArgument(MethodVisitor methodVisitor, SpelNode argument, ClassSE<?> requiredType) 指定された引数をスタックにロードするバイトコードを生成します。voidgenerateCodeForArgument(MethodVisitor methodVisitor, SpelNode argument, StringSE requiredTypeDesc) 指定された引数をスタックにロードするバイトコードを生成します。static voidinsertAnyNecessaryTypeConversionBytecodes(MethodVisitor mv, char targetDescriptor, StringSE stackDescriptor) スタックの内容と目的のターゲット型に基づいて、必要な数値変換バイトコードを挿入します。static voidinsertArrayStore(MethodVisitor mv, StringSE arrayComponentType) スタック項目を配列に格納するための適切なバイトコードを生成します。static voidinsertBoxIfNecessary(MethodVisitor mv, char ch) 特定の型に適切なボクシング指示を決定し(ボクシングが必要な場合)、指示を提供されたビジターに挿入します。static voidinsertBoxIfNecessary(MethodVisitor mv, @Nullable StringSE descriptor) 特定の型に適切なボクシング指示を決定し(ボクシングが必要な場合)、指示を提供されたビジターに挿入します。static voidinsertCheckCast(MethodVisitor mv, @Nullable StringSE descriptor) 提供された記述子に適切な CHECKCAST 命令を挿入します。static voidinsertNewArrayCode(MethodVisitor mv, int size, StringSE arrayType) 正しいバイトコードを生成して配列を構築します。static voidinsertNumericUnboxOrPrimitiveTypeCoercion(MethodVisitor mv, @Nullable StringSE stackDescriptor, char targetDescriptor) 数学演算子で使用するために、スタック上の(おそらくボックス化された)数値からプリミティブ数値型への変換を処理します。static voidinsertOptimalLoad(MethodVisitor mv, int value) スタックに数値をロードするための最適な命令を作成します。static voidinsertUnboxInsns(MethodVisitor mv, char ch, @Nullable StringSE stackDescriptor) ボックス型からプリミティブ値に変換するために必要なキャストと値の呼び出しを挿入します。static voidinsertUnboxNumberInsns(MethodVisitor mv, char targetDescriptor, @Nullable StringSE stackDescriptor) 数値の場合は、適切なメソッドを使用して、リクエストされたプリミティブ型に変換します。static booleanisBooleanCompatible(@Nullable StringSE descriptor) 記述子がブールプリミティブ型かブール参照型かを判別します。static booleanisIntegerForNumericOp(NumberSE number) 指定された数値が、バイトコードレベルでの数値演算の目的で整数と見なされるかどうかを決定します。static booleanisPrimitive(@Nullable StringSE descriptor) 記述子がプリミティブ型またはvoid用であるかどうかを判断します。static booleanisPrimitiveArray(@Nullable StringSE descriptor) 記述子がプリミティブ配列用であるかどうかを判断します (たとえば、"[[I" )。static booleanisPrimitiveOrUnboxableSupportedNumber(@Nullable StringSE descriptor) 指定された記述子がサポートされている数値用かどうかを判別してください。static boolean提供された記述子が、サポートされている数値型またはブール値のどちらであるかを判別してください。static booleanisReferenceTypeArray(StringSE arrayType) 指定された配列型にコアコンポーネント参照型があるかどうかを返します。現在スタックの最上位にある(現在のスコープ内の)アイテムの記述子を返します。voidバイトコードをプッシュして EvaluationContext(コンパイルされた式メソッドに渡される 2 番目のパラメーター)をロードします。voidバイトコードをプッシュしてターゲットをロードします(つまりintintvoidpushDescriptor(@Nullable StringSE descriptor) 最後に評価された式要素の記述子を記録します。voidregisterNewClinit(CodeFlow.ClinitAdder clinitAdder) 生成されたクラスの静的初期化子にコードを追加して、AST ノードのプライマリ generateCode() メソッドによって生成されたコードをサポートする ClinitAdder を登録します。voidregisterNewField(CodeFlow.FieldAdder fieldAdder) AST ノードのプライマリ generateCode() メソッドによって生成されたコードをサポートするために、生成されたクラスに新しいフィールドを追加する FieldAdder を登録します。static StringSEtoBoxedDescriptor(StringSE primitiveDescriptor) static StringSEtoDescriptor(ClassSE<?> type) 型の記述子を推定します。static StringSEオブジェクトインスタンス(またはnull)の記述子を決定します。static StringSE[]toDescriptors(ClassSE<?>[] types) クラスの配列から記述子の配列を作成します。static StringSEtoJvmDescriptor(ClassSE<?> clazz) 指定されたクラスの JVM 記述子を決定します。static StringSE[]toParamDescriptors(ConstructorSE<?> ctor) 指定されたコンストラクターのパラメーター型を表す記述子の配列を作成します。static StringSE[]toParamDescriptors(MethodSE method) 指定されたメソッドのパラメーター型を表す記述子の配列を作成します。static chartoPrimitiveTargetDesc(StringSE descriptor) 型記述子を 1 文字のプリミティブ記述子に変換します。voidコードフローが java.lang.Boolean に評価された最後の式を示している場合は、必要な命令を挿入して、ブールプリミティブにボックス化します。
コンストラクターの詳細
CodeFlow
指定されたクラスの新しいCodeFlowを構築します。- パラメーター:
className- クラスの名前classWriter- 対応する ASMClassWriter
メソッドの詳細
loadTarget
バイトコードをプッシュしてターゲットをロードします(つまり、CompiledExpression.getValue(target、context)の最初の引数として渡されたもの)- パラメーター:
mv- ロード命令を挿入するメソッドビジター
loadEvaluationContext
バイトコードをプッシュして EvaluationContext(コンパイルされた式メソッドに渡される 2 番目のパラメーター)をロードします。- パラメーター:
mv- ロード命令を挿入するメソッドビジター- 導入:
- 4.3.4
pushDescriptor
enterCompilationScope
public void enterCompilationScope()通常はネストされた式の評価により、新しいコンパイルスコープを入力します。たとえば、メソッド呼び出し式の引数が評価されている場合、各引数は新しいスコープで評価されます。exitCompilationScope
public void exitCompilationScope()通常、ネストされた式が評価された後で、コンパイルスコープを終了します。たとえば、メソッド呼び出しの引数が評価された後、このメソッドは以前の(外部)スコープに戻ります。lastDescriptor
unboxBooleanIfNecessary
コードフローが java.lang.Boolean に評価された最後の式を示している場合は、必要な命令を挿入して、ブールプリミティブにボックス化します。- パラメーター:
mv- 新しい命令を挿入するメソッドビジター
finish
public void finish()メインの式評価メソッドが生成された後に呼び出されるこのメソッドは、登録されている FieldAdders または ClinitAdders をコールバックして、コンパイルされた式を表すクラスに追加情報を追加します。registerNewField
AST ノードのプライマリ generateCode() メソッドによって生成されたコードをサポートするために、生成されたクラスに新しいフィールドを追加する FieldAdder を登録します。registerNewClinit
生成されたクラスの静的初期化子にコードを追加して、AST ノードのプライマリ generateCode() メソッドによって生成されたコードをサポートする ClinitAdder を登録します。nextFieldId
public int nextFieldId()nextFreeVariableId
public int nextFreeVariableId()getClassName
generateCodeForArgument
public void generateCodeForArgument(MethodVisitor methodVisitor, SpelNode argument, ClassSE<?> requiredType) 指定された引数をスタックにロードするバイトコードを生成します。指定された
requiredTypeの記述子を使用してgenerateCodeForArgument(MethodVisitor, SpelNode, String)に委譲します。このメソッドは、スタック上の引数の型が指定された
requiredTypeと一致することを確認するために必要なボックス化、アンボックス化、チェックキャストも実行します。AST 内のノードがコンストラクターまたはメソッド呼び出しの引数として使用される場合は、このメソッドを使用します。例: バイトコード内での実際のメソッド呼び出しで
int型である必要があるindexNodeを使用してメソッドを呼び出す場合は、codeFlow.generateCodeForArgument(methodVisitor, indexNode, int.class)を呼び出します。- パラメーター:
methodVisitor- コードが生成される ASMMethodVisitorargument- メソッドまたはコンストラクターへの引数を表すSpelNoderequiredType- 対応するコンストラクターまたはメソッドを呼び出すときに引数に必要な型- 導入:
- 6.2
- 関連事項:
generateCodeForArgument
public void generateCodeForArgument(MethodVisitor methodVisitor, SpelNode argument, StringSE requiredTypeDesc) 指定された引数をスタックにロードするバイトコードを生成します。このメソッドは、スタック上の引数の型が指定された
requiredTypeDescと一致することを確認するために必要なボックス化、アンボックス化、チェックキャストも実行します。AST 内のノードがコンストラクターまたはメソッド呼び出しの引数として使用される場合は、このメソッドを使用します。例: バイトコード内での実際のメソッド呼び出しで
int型である必要があるindexNodeを使用してメソッドを呼び出す場合は、codeFlow.generateCodeForArgument(methodVisitor, indexNode, "I")を呼び出します。- パラメーター:
methodVisitor- コードが生成される ASMMethodVisitorargument- メソッドまたはコンストラクターへの引数を表すSpelNoderequiredTypeDesc- 対応するコンストラクターまたはメソッドを呼び出すときに必要な引数の型の記述子- 導入:
- 6.2
- 関連事項:
insertUnboxInsns
ボックス型からプリミティブ値に変換するために必要なキャストと値の呼び出しを挿入します。- パラメーター:
mv- 命令を挿入するメソッドビジターch- 出力として必要なプリミティブ型stackDescriptor- スタックの一番上の型の記述子
insertUnboxNumberInsns
public static void insertUnboxNumberInsns(MethodVisitor mv, char targetDescriptor, @Nullable StringSE stackDescriptor) 数値の場合は、適切なメソッドを使用して、リクエストされたプリミティブ型に変換します。- パラメーター:
mv- 命令を挿入するメソッドビジターtargetDescriptor- 出力として必要なプリミティブ型stackDescriptor- スタックの一番上の型の記述子
insertAnyNecessaryTypeConversionBytecodes
public static void insertAnyNecessaryTypeConversionBytecodes(MethodVisitor mv, char targetDescriptor, StringSE stackDescriptor) スタックの内容と目的のターゲット型に基づいて、必要な数値変換バイトコードを挿入します。- パラメーター:
mv- 指示が配置されるメソッドビジターtargetDescriptor- ターゲット型の(プリミティブ)記述子stackDescriptor- スタックの最上位のオペランドの記述子
createSignatureDescriptor
createSignatureDescriptor
コンストラクターの JVM シグニチャー記述子を作成します。これは、括弧で囲まれたコンストラクターパラメーターの記述子と、それに続く戻り型の記述子(常に "V" )で構成されます。ここでの記述子は JVM 記述子であることに注意してください。コンパイラーが使用している他の記述子形式とは異なり、末尾のセミコロンは含まれていません。- パラメーター:
ctor- コンストラクター- 戻り値:
- 文字列署名記述子 (例: "(ILjava/lang/String;)V")
toJvmDescriptor
toDescriptorFromObject
isBooleanCompatible
isPrimitive
isPrimitiveArray
areBoxingCompatible
isPrimitiveOrUnboxableSupportedNumberOrBoolean
@Contract("null -> false") public static boolean isPrimitiveOrUnboxableSupportedNumberOrBoolean(@Nullable StringSE descriptor) 提供された記述子がサポートされている数値型またはブール値用であるかどうかを判別してください。コンパイルプロセスは、(現在のところ)特定の数値型のみをサポートしています。これらは double、float、long、int です。- パラメーター:
descriptor- 型の記述子- 戻り値:
true(記述子がサポートされている数値型またはブール値用である場合)
isPrimitiveOrUnboxableSupportedNumber
isIntegerForNumericOp
toPrimitiveTargetDesc
型記述子を 1 文字のプリミティブ記述子に変換します。- パラメーター:
descriptor- プリミティブ表現が必要な型の記述子- 戻り値:
- プリミティブ入力記述子の単一文字記述子
insertCheckCast
提供された記述子に適切な CHECKCAST 命令を挿入します。- パラメーター:
mv- 命令を挿入するメソッドビジターdescriptor- キャストする型の記述子
insertBoxIfNecessary
特定の型に適切なボクシング指示を決定し(ボクシングが必要な場合)、指示を提供されたビジターに挿入します。- パラメーター:
mv- 新しい命令のメソッドビジターdescriptor- ボクシングが必要かどうかにかかわらず、型の記述子
insertBoxIfNecessary
特定の型に適切なボクシング指示を決定し(ボクシングが必要な場合)、指示を提供されたビジターに挿入します。- パラメーター:
mv- 新しい命令のメソッドビジターch- ボクシングが必要になる可能性がある型の記述子
toDescriptor
toParamDescriptors
toParamDescriptors
指定されたコンストラクターのパラメーター型を表す記述子の配列を作成します。パラメーターがない場合は、サイズがゼロの配列を返します。- パラメーター:
ctor- コンストラクター- 戻り値:
- ディスクリプタの文字列配列、各コンストラクターパラメーターに 1 つのエントリ
toDescriptors
insertOptimalLoad
スタックに数値をロードするための最適な命令を作成します。- パラメーター:
mv- バイトコードを挿入する場所value- ロードする値
insertArrayStore
スタック項目を配列に格納するための適切なバイトコードを生成します。使用する命令は、型がプリミティブ型か参照型かによって異なります。
- パラメーター:
mv- バイトコードを挿入する場所arrayComponentType- 配列のコンポーネント型
arrayCodeFor
NEWARRAY バイトコードに使用する適切な T タグを決定します。- パラメーター:
arrayType- 配列プリミティブコンポーネント型- 戻り値:
- NEWARRAY に使用する T タグ
isReferenceTypeArray
指定された配列型にコアコンポーネント参照型があるかどうかを返します。insertNewArrayCode
正しいバイトコードを生成して配列を構築します。使用するオペコードと、オペコードとともに渡すシグネチャーは、配列型のシグネチャーによって異なります。- パラメーター:
mv- コードを挿入するメソッドビジターsize- 配列のサイズarrayType- 配列の型
insertNumericUnboxOrPrimitiveTypeCoercion
public static void insertNumericUnboxOrPrimitiveTypeCoercion(MethodVisitor mv, @Nullable StringSE stackDescriptor, char targetDescriptor) 数学演算子で使用するために、スタック上の(おそらくボックス化された)数値からプリミティブ数値型への変換を処理します。例: Integer から double へは、'Number.doubleValue()' を呼び出す必要があるだけですが、int から double へは、バイトコード 'i2d' を使用する必要があります。
- パラメーター:
mv- 指示を追加する必要がある場合のメソッドビジターstackDescriptor- スタック上のオペランドの記述子targetDescriptor- プリミティブ型記述子
toBoxedDescriptor