Java Reflection: ローカル変数名の公開
Java Reflection は、クラス、メソッド、およびフィールドのメタデータを検査および操作するための強力なメカニズムを提供します実行時。ただし、ローカル変数の名前へのアクセスには、歴史的に課題がありました。
バイトコード エンジニアリングを利用した従来のアプローチ
Java 8 より前では、コンパイラーによって生成されたクラス ファイルには次のものが含まれていました。ローカル変数名に関する情報。ただし、この情報はスペースを節約するために最適化されて削除されることがよくあります。それにもかかわらず、ASM などのバイトコード エンジニアリング ライブラリを使用して、クラス ファイル内のローカル変数テーブル属性を検査し、利用可能な場合は変数名を抽出することができます。このアプローチは主に、運用コードではなく開発ツールに適しています。
Java 8 以降: パラメータ名の公開
Java 8 の導入により、ローカルのサポートが制限されました。変数名が追加されました。具体的には、特殊なタイプのローカル変数であるパラメータ名に、リフレクション経由でアクセスできるようになりました。これにより、依存関係注入コンテナーで使用される @ParameterName などのアノテーションを置き換えることができます。
実際の実装
Java 8 のパラメーター名のサポートの使用法を説明するには、次のことを考慮してください。コード:
public void baz(Foo... foos) { for (Foo foo : foos) { // Print the name of each foo - b, a, and r System.out.println(foo.getName()); } }
この例では、各 Foo インスタンスに という名前のゲッター メソッドがあると仮定します。 getName()。リフレクションを使用すると、baz メソッドのパラメータ名を取得できます。
Method method = MyClass.class.getMethod("baz", Foo[].class); for (Parameter parameter : method.getParameters()) { System.out.println(parameter.getName()); }
このアプローチでは、パラメータの名前が出力されます。この場合は「foos」になります。すべてのローカル変数の名前にアクセスするための完全なソリューションを提供するわけではありませんが、パラメーター アクセスのコンテキストにおける Java Reflection の機能に対する有用な拡張を表します。
以上がJava Reflection はローカル変数名にアクセスできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。