クラス CodeFlow
java.lang.ObjectSE
org.springframework.expression.spel.CodeFlow
- 実装されたすべてのインターフェース:
Opcodes
コンパイルプロセスによって生成されるクラスを管理します。
バイトコードの生成時に中間コンパイル状態を記録します。また、さまざまなバイトコード生成ヘルパー関数も含まれています。
- 導入:
- 4.1
- 作成者:
- Andy Clement, Juergen Hoeller
ネストされたクラスのサマリー
ネストされたクラス修飾子と型クラス説明static interface
clinit
静的初期化ブロックを生成するために使用されるインターフェース。static interface
フィールドの生成に使用されるインターフェース。フィールドのサマリー
インターフェース org.springframework.asm.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, V9
コンストラクターの概要
コンストラクターメソッドのサマリー
修飾子と型メソッド説明static boolean
areBoxingCompatible
(StringSE desc1, StringSE desc2) ボクシング / アンボクシングが 1 つの型から別の型に移行できるかどうかを決定します。static int
arrayCodeFor
(StringSE arrayType) NEWARRAY バイトコードに使用する適切な T タグを決定します。static StringSE
createSignatureDescriptor
(ConstructorSE<?> ctor) コンストラクターの JVM シグニチャー記述子を作成します。static StringSE
createSignatureDescriptor
(MethodSE method) メソッドの JVM シグニチャー記述子を作成します。void
通常、ネストされた式の評価により、新しいコンパイルスコープを入力します。void
通常、ネストされた式が評価された後で、コンパイルスコープを終了します。void
finish()
メインの式評価メソッドが生成された後に呼び出されるこのメソッドは、登録されている FieldAdders または ClinitAdders をコールバックして、コンパイルされた式を表すクラスに追加情報を追加します。static void
insertAnyNecessaryTypeConversionBytecodes
(MethodVisitor mv, char targetDescriptor, StringSE stackDescriptor) スタックの内容と目的のターゲット型に基づいて、必要な数値変換バイトコードを挿入します。static void
insertArrayStore
(MethodVisitor mv, StringSE arrayElementType) スタック項目を配列に格納するための適切なバイトコードを生成します。static void
insertBoxIfNecessary
(MethodVisitor mv, char ch) 特定の型に適切なボクシング指示を決定し(ボクシングが必要な場合)、指示を提供されたビジターに挿入します。static void
insertBoxIfNecessary
(MethodVisitor mv, StringSE descriptor) 特定の型に適切なボクシング指示を決定し(ボクシングが必要な場合)、指示を提供されたビジターに挿入します。static void
insertCheckCast
(MethodVisitor mv, StringSE descriptor) 提供された記述子に適切な CHECKCAST 命令を挿入します。static void
insertNewArrayCode
(MethodVisitor mv, int size, StringSE arrayType) 正しいバイトコードを生成して配列を構築します。static void
insertNumericUnboxOrPrimitiveTypeCoercion
(MethodVisitor mv, StringSE stackDescriptor, char targetDescriptor) 数学演算子で使用するために、スタック上の(おそらくボックス化された)数値からプリミティブ数値型への変換を処理します。static void
insertOptimalLoad
(MethodVisitor mv, int value) スタックに数値をロードするための最適な命令を作成します。static void
insertUnboxInsns
(MethodVisitor mv, char ch, StringSE stackDescriptor) ボックス型からプリミティブ値に変換するために必要なキャストと値の呼び出しを挿入します。static void
insertUnboxNumberInsns
(MethodVisitor mv, char targetDescriptor, StringSE stackDescriptor) 数値の場合は、適切なメソッドを使用して、リクエストされたプリミティブ型に変換します。static boolean
isBooleanCompatible
(StringSE descriptor) 記述子がブールプリミティブ型かブール参照型かを判別します。static boolean
isIntegerForNumericOp
(NumberSE number) 指定された数値が、バイトコードレベルでの数値演算の目的で整数と見なされるかどうかを決定します。static boolean
isPrimitive
(StringSE descriptor) 記述子がプリミティブ型またはvoid
用であるかどうかを判断します。static boolean
isPrimitiveArray
(StringSE descriptor) 記述子がプリミティブ配列用かどうかを判断します(例:static boolean
isPrimitiveOrUnboxableSupportedNumber
(StringSE descriptor) 指定された記述子がサポートされている数値用かどうかを判別してください。static boolean
提供された記述子が、サポートされている数値型またはブール値のどちらであるかを判別してください。static boolean
isReferenceTypeArray
(StringSE arrayType) 指定された配列型にコアコンポーネント参照型があるかどうかを返します。現在スタックの最上位にある(現在のスコープ内の)アイテムの記述子を返します。void
バイトコードをプッシュして EvaluationContext(コンパイルされた式メソッドに渡される 2 番目のパラメーター)をロードします。void
バイトコードをプッシュしてターゲットをロードします(つまりint
int
void
pushDescriptor
(StringSE descriptor) 最後に評価された式要素の記述子を記録します。void
registerNewClinit
(CodeFlow.ClinitAdder clinitAdder) 生成されたクラスの静的初期化子にコードを追加して、AST ノードのプライマリ generateCode() メソッドによって生成されたコードをサポートする ClinitAdder を登録します。void
registerNewField
(CodeFlow.FieldAdder fieldAdder) AST ノードのプライマリ generateCode() メソッドによって生成されたコードをサポートするために、生成されたクラスに新しいフィールドを追加する FieldAdder を登録します。static StringSE
toBoxedDescriptor
(StringSE primitiveDescriptor) static StringSE
toDescriptor
(ClassSE<?> type) 型の記述子を推定します。static StringSE
toDescriptorFromObject
(ObjectSE value) オブジェクトインスタンス(またはnull
)の記述子を決定します。static StringSE[]
toDescriptors
(ClassSE<?>[] types) クラスの配列から記述子の配列を作成します。static StringSE
toJvmDescriptor
(ClassSE<?> clazz) 指定されたクラスの JVM 記述子を決定します。static StringSE[]
toParamDescriptors
(ConstructorSE<?> ctor) 指定されたコンストラクターのパラメーター型を表す記述子の配列を作成します。static StringSE[]
toParamDescriptors
(MethodSE method) 指定されたメソッドのパラメーター型を表す記述子の配列を作成します。static char
toPrimitiveTargetDesc
(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
最後に評価された式要素の記述子を記録します。- パラメーター:
descriptor
- 最近評価された要素の型記述子
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
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
メソッドの JVM シグニチャー記述子を作成します。これは、括弧で囲まれたメソッドパラメーターの記述子で構成され、その後に戻りの型の記述子が続きます。ここでの記述子は JVM 記述子であることに注意してください。コンパイラーが使用している他の記述子形式とは異なり、末尾のセミコロンは含まれていません。- パラメーター:
method
- メソッド- 戻り値:
- 文字列署名記述子(例: "(ILjava/lang/String;)V")
createSignatureDescriptor
コンストラクターの JVM シグニチャー記述子を作成します。これは、括弧で囲まれたコンストラクターパラメーターの記述子と、それに続く戻り型の記述子(常に "V" )で構成されます。ここでの記述子は JVM 記述子であることに注意してください。コンパイラーが使用している他の記述子形式とは異なり、末尾のセミコロンは含まれていません。- パラメーター:
ctor
- コンストラクター- 戻り値:
- 文字列署名記述子(例: "(ILjava/lang/String;)V")
toJvmDescriptor
指定されたクラスの JVM 記述子を決定します。コンパイルプロセスで使用される他の記述子とは異なり、これは JVM が必要とする記述子であるため、必要な末尾のセミコロンが含まれます。(たとえば Ljava/lang/String; Ljava/lang/String ではなく)- パラメーター:
clazz
- クラス- 戻り値:
- クラスの JVM 記述子
toDescriptorFromObject
オブジェクトインスタンス(またはnull
)の記述子を決定します。- パラメーター:
value
- オブジェクト (おそらくnull
)- 戻り値:
- オブジェクトの型記述子 (
null
値の記述子は "Ljava/lang/Object" です)
isBooleanCompatible
記述子がブールプリミティブ型かブール参照型かを判別します。- パラメーター:
descriptor
- 型記述子- 戻り値:
- 記述子がブール互換である場合は
true
isPrimitive
記述子がプリミティブ型またはvoid
用であるかどうかを判断します。- パラメーター:
descriptor
- 型記述子- 戻り値:
- プリミティブ型の場合は
true
、またはvoid
isPrimitiveArray
ディスクリプタがプリミティブ配列用であるかどうかを判別します(例: "[[I" )。- パラメーター:
descriptor
- 可能なプリミティブ配列の記述子- 戻り値:
true
(記述子がプリミティブ配列の場合)
areBoxingCompatible
ボクシング / アンボクシングが 1 つの型から別の型に移行できるかどうかを決定します。型の少なくとも 1 つがボックス化された形式 (つまり、単一の char 記述子) であると想定します。
- 戻り値:
- 1 つの記述子から別の記述子に(ボクシングを介して)取得できる場合は
true
isPrimitiveOrUnboxableSupportedNumberOrBoolean
提供された記述子がサポートされている数値型またはブール値用であるかどうかを判別してください。コンパイルプロセスは、(現在のところ)特定の数値型のみをサポートしています。これらは double、float、long、int です。- パラメーター:
descriptor
- 型の記述子- 戻り値:
true
(記述子がサポートされている数値型またはブール値用である場合)
isPrimitiveOrUnboxableSupportedNumber
指定された記述子がサポートされている数値用かどうかを判別してください。コンパイルプロセスは、(現在のところ)特定の数値型のみをサポートしています。これらは double、float、long、int です。- パラメーター:
descriptor
- 型の記述子- 戻り値:
- 記述子がサポートされている数値型用である場合は
true
isIntegerForNumericOp
指定された数値が、バイトコードレベルでの数値演算の目的で整数と見なされるかどうかを決定します。toPrimitiveTargetDesc
型記述子を 1 文字のプリミティブ記述子に変換します。- パラメーター:
descriptor
- プリミティブ表現が必要な型の記述子- 戻り値:
- プリミティブ入力記述子の単一文字記述子
insertCheckCast
提供された記述子に適切な CHECKCAST 命令を挿入します。- パラメーター:
mv
- 命令を挿入するメソッドビジターdescriptor
- キャストする型の記述子
insertBoxIfNecessary
特定の型に適切なボクシング指示を決定し(ボクシングが必要な場合)、指示を提供されたビジターに挿入します。- パラメーター:
mv
- 新しい命令のメソッドビジターdescriptor
- ボクシングが必要かどうかにかかわらず、型の記述子
insertBoxIfNecessary
特定の型に適切なボクシング指示を決定し(ボクシングが必要な場合)、指示を提供されたビジターに挿入します。- パラメーター:
mv
- 新しい命令のメソッドビジターch
- ボクシングが必要になる可能性がある型の記述子
toDescriptor
型の記述子を推定します。ディスクリプタは JVM 型名に似ていますが、末尾の ";" がありません。Object の場合、記述子は "Ljava/lang/Object" で、int の場合は "I" です。- パラメーター:
type
- 記述子を決定する型(プリミティブの場合があります)- 戻り値:
- 記述子
toParamDescriptors
指定されたメソッドのパラメーター型を表す記述子の配列を作成します。パラメーターがない場合は、サイズがゼロの配列を返します。- パラメーター:
method
- メソッド- 戻り値:
- ディスクリプタの文字列配列、メソッドパラメーターごとに 1 つのエントリ
toParamDescriptors
指定されたコンストラクターのパラメーター型を表す記述子の配列を作成します。パラメーターがない場合は、サイズがゼロの配列を返します。- パラメーター:
ctor
- コンストラクター- 戻り値:
- ディスクリプタの文字列配列、各コンストラクターパラメーターに 1 つのエントリ
toDescriptors
クラスの配列から記述子の配列を作成します。- パラメーター:
types
- クラスの入力配列- 戻り値:
- 記述子の配列
insertOptimalLoad
スタックに数値をロードするための最適な命令を作成します。- パラメーター:
mv
- バイトコードを挿入する場所value
- ロードする値
insertArrayStore
スタック項目を配列に格納するための適切なバイトコードを生成します。使用する命令は、型がプリミティブ型か参照型かによって異なります。- パラメーター:
mv
- バイトコードを挿入する場所arrayElementType
- 配列要素の型
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