クラス CodeFlow

java.lang.ObjectSE
org.springframework.expression.spel.CodeFlow
実装されたすべてのインターフェース:
Opcodes

public class CodeFlow extends ObjectSE implements Opcodes
コンパイルプロセスによって生成されるクラスを管理します。

バイトコードの生成時に中間コンパイル状態を記録します。また、さまざまなバイトコード生成ヘルパー関数も含まれています。

導入:
4.1
作成者:
Andy Clement, Juergen Hoeller
  • コンストラクターの詳細

    • CodeFlow

      public CodeFlow(StringSE className, ClassWriter classWriter)
      指定されたクラスの新しい CodeFlow を構築します。
      パラメーター:
      className - クラスの名前
      classWriter - 対応する ASM ClassWriter
  • メソッドの詳細

    • loadTarget

      public void loadTarget(MethodVisitor mv)
      バイトコードをプッシュしてターゲットをロードします(つまり、CompiledExpression.getValue(target、context)の最初の引数として渡されたもの)
      パラメーター:
      mv - ロード命令を挿入するメソッドビジター
    • loadEvaluationContext

      public void loadEvaluationContext(MethodVisitor mv)
      バイトコードをプッシュして EvaluationContext(コンパイルされた式メソッドに渡される 2 番目のパラメーター)をロードします。
      パラメーター:
      mv - ロード命令を挿入するメソッドビジター
      導入:
      4.3.4
    • pushDescriptor

      public void pushDescriptor(@Nullable StringSE descriptor)
      最後に評価された式要素の記述子を記録します。
      パラメーター:
      descriptor - 最近評価された要素の型記述子
    • enterCompilationScope

      public void enterCompilationScope()
      通常はネストされた式の評価により、新しいコンパイルスコープを入力します。たとえば、メソッド呼び出し式の引数が評価されている場合、各引数は新しいスコープで評価されます。
    • exitCompilationScope

      public void exitCompilationScope()
      通常、ネストされた式が評価された後で、コンパイルスコープを終了します。たとえば、メソッド呼び出しの引数が評価された後、このメソッドは以前の(外部)スコープに戻ります。
    • lastDescriptor

      @Nullable public StringSE lastDescriptor()
      現在スタックの最上位にある(現在のスコープ内の)アイテムの記述子を返します。
    • unboxBooleanIfNecessary

      public void unboxBooleanIfNecessary(MethodVisitor mv)
      コードフローが java.lang.Boolean に評価された最後の式を示している場合は、必要な命令を挿入して、ブールプリミティブにボックス化します。
      パラメーター:
      mv - 新しい命令を挿入するメソッドビジター
    • finish

      public void finish()
      メインの式評価メソッドが生成された後に呼び出されるこのメソッドは、登録されている FieldAdders または ClinitAdders をコールバックして、コンパイルされた式を表すクラスに追加情報を追加します。
    • registerNewField

      public void registerNewField(CodeFlow.FieldAdder fieldAdder)
      AST ノードのプライマリ generateCode() メソッドによって生成されたコードをサポートするために、生成されたクラスに新しいフィールドを追加する FieldAdder を登録します。
    • registerNewClinit

      public void registerNewClinit(CodeFlow.ClinitAdder clinitAdder)
      生成されたクラスの静的初期化子にコードを追加して、AST ノードのプライマリ generateCode() メソッドによって生成されたコードをサポートする ClinitAdder を登録します。
    • nextFieldId

      public int nextFieldId()
    • nextFreeVariableId

      public int nextFreeVariableId()
    • getClassName

      public StringSE getClassName()
    • insertUnboxInsns

      public static void insertUnboxInsns(MethodVisitor mv, char ch, @Nullable StringSE stackDescriptor)
      ボックス型からプリミティブ値に変換するために必要なキャストと値の呼び出しを挿入します。
      パラメーター:
      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

      public static StringSE createSignatureDescriptor(MethodSE method)
      メソッドの JVM シグニチャー記述子を作成します。これは、括弧で囲まれたメソッドパラメーターの記述子で構成され、その後に戻りの型の記述子が続きます。ここでの記述子は JVM 記述子であることに注意してください。コンパイラーが使用している他の記述子形式とは異なり、末尾のセミコロンは含まれていません。
      パラメーター:
      method - メソッド
      戻り値:
      文字列署名記述子(例: "(ILjava/lang/String;)V")
    • createSignatureDescriptor

      public static StringSE createSignatureDescriptor(ConstructorSE<?> ctor)
      コンストラクターの JVM シグニチャー記述子を作成します。これは、括弧で囲まれたコンストラクターパラメーターの記述子と、それに続く戻り型の記述子(常に "V" )で構成されます。ここでの記述子は JVM 記述子であることに注意してください。コンパイラーが使用している他の記述子形式とは異なり、末尾のセミコロンは含まれていません。
      パラメーター:
      ctor - コンストラクター
      戻り値:
      文字列署名記述子(例: "(ILjava/lang/String;)V")
    • toJvmDescriptor

      public static StringSE toJvmDescriptor(ClassSE<?> clazz)
      指定されたクラスの JVM 記述子を決定します。コンパイルプロセスで使用される他の記述子とは異なり、これは JVM が必要とする記述子であるため、必要な末尾のセミコロンが含まれます。(たとえば Ljava/lang/String; Ljava/lang/String ではなく)
      パラメーター:
      clazz - クラス
      戻り値:
      クラスの JVM 記述子
    • toDescriptorFromObject

      public static StringSE toDescriptorFromObject(@Nullable ObjectSE value)
      オブジェクトインスタンス(または null)の記述子を決定します。
      パラメーター:
      value - オブジェクト (おそらく null)
      戻り値:
      オブジェクトの型記述子 (null 値の記述子は "Ljava/lang/Object" です)
    • isBooleanCompatible

      public static boolean isBooleanCompatible(@Nullable StringSE descriptor)
      記述子がブールプリミティブ型かブール参照型かを判別します。
      パラメーター:
      descriptor - 型記述子
      戻り値:
      記述子がブール互換である場合は true 
    • isPrimitive

      public static boolean isPrimitive(@Nullable StringSE descriptor)
      記述子がプリミティブ型または void 用であるかどうかを判断します。
      パラメーター:
      descriptor - 型記述子
      戻り値:
      プリミティブ型の場合は true、または void
    • isPrimitiveArray

      public static boolean isPrimitiveArray(@Nullable StringSE descriptor)
      ディスクリプタがプリミティブ配列用であるかどうかを判別します(例: "[[I" )。
      パラメーター:
      descriptor - 可能なプリミティブ配列の記述子
      戻り値:
      true (記述子がプリミティブ配列の場合)
    • areBoxingCompatible

      public static boolean areBoxingCompatible(StringSE desc1, StringSE desc2)
      ボクシング / アンボクシングが 1 つの型から別の型に移行できるかどうかを決定します。

      型の少なくとも 1 つがボックス化された形式 (つまり、単一の char 記述子) であると想定します。

      戻り値:
      1 つの記述子から別の記述子に(ボクシングを介して)取得できる場合は true 
    • isPrimitiveOrUnboxableSupportedNumberOrBoolean

      public static boolean isPrimitiveOrUnboxableSupportedNumberOrBoolean(@Nullable StringSE descriptor)
      提供された記述子がサポートされている数値型またはブール値用であるかどうかを判別してください。コンパイルプロセスは、(現在のところ)特定の数値型のみをサポートしています。これらは double、float、long、int です。
      パラメーター:
      descriptor - 型の記述子
      戻り値:
      true (記述子がサポートされている数値型またはブール値用である場合)
    • isPrimitiveOrUnboxableSupportedNumber

      public static boolean isPrimitiveOrUnboxableSupportedNumber(@Nullable StringSE descriptor)
      指定された記述子がサポートされている数値用かどうかを判別してください。コンパイルプロセスは、(現在のところ)特定の数値型のみをサポートしています。これらは double、float、long、int です。
      パラメーター:
      descriptor - 型の記述子
      戻り値:
      記述子がサポートされている数値型用である場合は true 
    • isIntegerForNumericOp

      public static boolean isIntegerForNumericOp(NumberSE number)
      指定された数値が、バイトコードレベルでの数値演算の目的で整数と見なされるかどうかを決定します。
      パラメーター:
      number - チェックする数
      戻り値:
      IntegerSEShortSEByteSE の場合は true 
    • toPrimitiveTargetDesc

      public static char toPrimitiveTargetDesc(StringSE descriptor)
      型記述子を 1 文字のプリミティブ記述子に変換します。
      パラメーター:
      descriptor - プリミティブ表現が必要な型の記述子
      戻り値:
      プリミティブ入力記述子の単一文字記述子
    • insertCheckCast

      public static void insertCheckCast(MethodVisitor mv, @Nullable StringSE descriptor)
      提供された記述子に適切な CHECKCAST 命令を挿入します。
      パラメーター:
      mv - 命令を挿入するメソッドビジター
      descriptor - キャストする型の記述子
    • insertBoxIfNecessary

      public static void insertBoxIfNecessary(MethodVisitor mv, @Nullable StringSE descriptor)
      特定の型に適切なボクシング指示を決定し(ボクシングが必要な場合)、指示を提供されたビジターに挿入します。
      パラメーター:
      mv - 新しい命令のメソッドビジター
      descriptor - ボクシングが必要かどうかにかかわらず、型の記述子
    • insertBoxIfNecessary

      public static void insertBoxIfNecessary(MethodVisitor mv, char ch)
      特定の型に適切なボクシング指示を決定し(ボクシングが必要な場合)、指示を提供されたビジターに挿入します。
      パラメーター:
      mv - 新しい命令のメソッドビジター
      ch - ボクシングが必要になる可能性がある型の記述子
    • toDescriptor

      public static StringSE toDescriptor(ClassSE<?> type)
      型の記述子を推定します。ディスクリプタは JVM 型名に似ていますが、末尾の ";" がありません。Object の場合、記述子は "Ljava/lang/Object" で、int の場合は "I" です。
      パラメーター:
      type - 記述子を決定する型(プリミティブの場合があります)
      戻り値:
      記述子
    • toParamDescriptors

      public static StringSE[] toParamDescriptors(MethodSE method)
      指定されたメソッドのパラメーター型を表す記述子の配列を作成します。パラメーターがない場合は、サイズがゼロの配列を返します。
      パラメーター:
      method - メソッド
      戻り値:
      ディスクリプタの文字列配列、メソッドパラメーターごとに 1 つのエントリ
    • toParamDescriptors

      public static StringSE[] toParamDescriptors(ConstructorSE<?> ctor)
      指定されたコンストラクターのパラメーター型を表す記述子の配列を作成します。パラメーターがない場合は、サイズがゼロの配列を返します。
      パラメーター:
      ctor - コンストラクター
      戻り値:
      ディスクリプタの文字列配列、各コンストラクターパラメーターに 1 つのエントリ
    • toDescriptors

      public static StringSE[] toDescriptors(ClassSE<?>[] types)
      クラスの配列から記述子の配列を作成します。
      パラメーター:
      types - クラスの入力配列
      戻り値:
      記述子の配列
    • insertOptimalLoad

      public static void insertOptimalLoad(MethodVisitor mv, int value)
      スタックに数値をロードするための最適な命令を作成します。
      パラメーター:
      mv - バイトコードを挿入する場所
      value - ロードする値
    • insertArrayStore

      public static void insertArrayStore(MethodVisitor mv, StringSE arrayElementType)
      スタック項目を配列に格納するための適切なバイトコードを生成します。使用する命令は、型がプリミティブ型か参照型かによって異なります。
      パラメーター:
      mv - バイトコードを挿入する場所
      arrayElementType - 配列要素の型
    • arrayCodeFor

      public static int arrayCodeFor(StringSE arrayType)
      NEWARRAY バイトコードに使用する適切な T タグを決定します。
      パラメーター:
      arrayType - 配列プリミティブコンポーネント型
      戻り値:
      NEWARRAY に使用する T タグ
    • isReferenceTypeArray

      public static boolean isReferenceTypeArray(StringSE arrayType)
      指定された配列型にコアコンポーネント参照型があるかどうかを返します。
    • insertNewArrayCode

      public static void insertNewArrayCode(MethodVisitor mv, int size, StringSE arrayType)
      正しいバイトコードを生成して配列を構築します。使用するオペコードと、オペコードとともに渡すシグネチャーは、配列型のシグネチャーによって異なります。
      パラメーター:
      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

      public static StringSE toBoxedDescriptor(StringSE primitiveDescriptor)