この記事では、java に関する関連知識を提供します。主に、Lambda ソース コードの表示方法に関する関連問題を紹介します。Lambda 式を使用すると、コードに対して多数の最適化を実行できます。複数の式を使用すると、次のことができます。たった 1 行のコードで多くのことができます。見てみましょう。皆さんのお役に立てれば幸いです。
推奨学習: 「java ビデオ チュートリアル 」
Java8 でラムダ式が追加されたことは誰もが知っています。ラムダ式を使用してください。コードを大幅に最適化でき、わずか数行のコードで多くのことを行うことができます。この章では Lambda を例として取り上げます。最初のセクションではその基礎となる実行原理について説明し、2 番目のセクションでは Lambda の一般的な姿勢について説明します仕事の流れ。
まず、以下に示すラムダ式のデモを見ていきます。コードは比較的単純で、新しいスレッドを開始して文章を出力するだけですが、図のコード () -> System.out.println (「ラムダが実行される」) については、多くの学生が混乱していると思います。 Java このコードを認識しますか?
記述方法を匿名内部クラスに変更すると、以下のように非常に明確になり、誰でも理解できるようになります。
ということですか。 () -> System.out.println (“ lambda が実行される”) この形式のコードは実際に内部クラスを作成しますか?実際、これは最も単純な Lambda 式です。IDEA ではソース コードとその基礎となる構造を確認できません。ここでは、その基礎となる実装を確認するいくつかの方法を紹介します。
2. 例外判定方法
コード実行中に能動的に例外をスローし、スタックを出力することができます。スタックはその実行軌跡を説明します。一般に、この方法はシンプルで効率的であり、基本的には、以下に示すように、多くの場合に隠しコードを試してみましょう:例外スタックから、JVM が現在のクラスの内部クラスを自動的に作成することがわかります。 class (エラースタックに複数回出現する $ は内部クラスを示します) 内部クラスのコードの実行中に例外がスローされますが、ここに示されているコードは不明なソースであるため、デバッグできません。 , 例外 どちらもコードの実行パスを公開でき、ブレークポイントを設定して再度実行することができますが、ラムダ式の場合は例外判定メソッドを通じて、内部クラスの存在が分かるだけで、内部クラスのソースコードを見ることはできません。クラス。
3. javap コマンドの使用方法
javap は Java に付属している、クラスのバイトコードファイルを参照できるツールで、Java 基本環境がインストールされているコンピュータでは、以下のように javap コマンドを直接実行できます。 :コマンドオプションのうち、バイトコードファイルの内容を完全に出力するには、主に -v -verbose コマンドを使用します。
次に、javap コマンドを使用して Lambda.class ファイルを表示します。説明中に、クラス ファイルに関する知識も取り入れます。
コマンド ウィンドウで Lambda.class の場所を見つけ、コマンド javap -verbose Lambda.class を実行すると、長いリストが表示されます。これらはアセンブリ命令と呼ばれます。実行してみましょう。次に説明しましょう (参考資料はすべて Java 仮想マシン仕様から引用されているため、1 つずつ引用することはしません): アセンブリ手順では、定数プールで始まる型の長いリストを簡単に見つけることができます。定数プールと呼びます正式には英語では Run-Time Constant Pool と呼ばれます定数が詰め込まれたテーブルとして単純に理解していますこのテーブルにはコンパイル時の明確な数値とテキスト、クラス、メソッド、フィールドの型情報が含まれています、など。テーブル内の各要素は cpinfo と呼ばれます。cp
info は一意の識別 (タグ) 名で構成されます。現在、合計のタグ タイプは次のとおりです:投稿 これは私たちが解析した画像の一部です:
画像内の「定数プール」という言葉は、現在の情報が定数プール;
cp_info
で、最初の列の #1 は定数プール内の 1 とマークされた位置を表します。各行の 2 列目は、cp_info
の一意の識別子 (タグ) です。たとえば、Methodref は、上の表の CONSTANT_Methodref に対応します (上の表の値は、これは、現在の行がメソッドの名前、入力パラメータのタイプ、出力パラメータのタイプなどのメソッドの説明情報を表すことを意味します。具体的な意味は、Java 仮想マシンの仕様に記載されています。 Methodref のスクリーンショットは次のとおりです:
各行の 3 列目に、特定の値の場合、その値が直接表示されます。これは複素数値です。cp_info が表示されます。たとえば、図で赤でマークされた 2 の
の参照は、位置 13 と 14 にある 2 つの cp_info
を指します。13 は、を意味します。メソッド名が init であること、14 はメソッドに戻り値がないことを意味し、その組み合わせはメソッドの名前を表します。戻り値の型はパラメーターなしのコンストラクターです。
4 番目各行の列は特定の値です。
より重要な cp_info タイプについては、その意味を説明します:
次に、アセンブリ命令の出力の最後を見てみますと、以下のように例外判定メソッドに内部クラスが存在します。上の図ではたくさんの矢印があり、現在の内部クラスのすべての情報がレイヤーごとに明確に表現されています。
4. 概要
要約すると、Lambda 式の実行は主に invokedynamic の JVM 命令に依存しています。デモするクラスのフル パスは、demo.eight.Lambda です。興味のある学生は次のことを行うことができます。自分たちで試してみてください。 早速、記事は終わりです。第 3 回シリーズをお楽しみに! 推奨学習: 「Java ビデオ チュートリアル
」以上がJava スキルのまとめ: Lambda ソース コードの読み方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。