ホームページ > Java > &#&チュートリアル > Java Reflectionを使用して、実行時にクラスを検査および操作するにはどうすればよいですか?

Java Reflectionを使用して、実行時にクラスを検査および操作するにはどうすればよいですか?

Karen Carpenter
リリース: 2025-03-11 17:46:16
オリジナル
214 人が閲覧しました

Java Reflectionを使用して実行時にクラスを検査および操作する方法

Java Reflectionは、コンパイル時間ではなく、実行時にクラスとそのメンバー(フィールド、メソッド、コンストラクター)を調べて相互作用する強力なメカニズムを提供します。これは、 java.lang.Refflect パッケージを使用して達成されます。使用方法の内訳は次のとおりです。

最初に、検査するクラスを表す code> code オブジェクトを取得する必要があります。これは、いくつかの方法で実行できます。

  • class.forname()このメソッドを使用して、完全に適格なクラス名を文字列として受け取ります。例: class<?> myclass = class.forname(" com.example.myclass"); このメソッドは classNotFoundException 例: myclass myobject = new MyClass();クラス<?> myclass = myobject.getClass();
  • プリミティブタイプのクラスリテラルを使用: int のようなプリミティブタイプの int.class 。コンストラクター: constructor<> [] constructors = myclass.getConstructors(); これは、すべての public コンストラクターの配列を返します。特定のコンストラクター(例:パラメータータイプによる)を取得するには、 myclass.getConstructor(parametertype1.class、parametertype2.class、...);
  • メソッドの取得: メソッド[]メソッド= myclass.getmeths()特定の方法を取得するには、<code> myclass.getMethod(&quot; methodname&quot;、parametertype1.class、parametertype2.class、...); 非公開メソッドにアクセスするには、myclass.getdeclaredmethods() myclass.getFields(); これは、すべての public フィールドの配列を返します。メソッドと同様に、非パブリックフィールドに myclass.getDeclaredfields()を使用します。 field.get(object)/ field.set(object、value)、それぞれ。 invocationTargetException Illegalaccessexception 、および nosuchmethodexception <h2>などの潜在的な例外を処理することを忘れないでください。ただし、追加の手順が必要です。 <code> myclass.getDeclaredFields()または myclass.getDeclaredMethods()を呼び出すだけで、プライベートを含むすべての すべてのメンバーにアクセスできます。ただし、それらに直接アクセスまたは変更しようとすると、 Illegalaccessexception がまだスローされます。これを克服するには、 setAccessible(true)メソッドをフィールドまたはメソッドオブジェクトで使用する必要があります。 privatefield.setAccessible(true);オブジェクト値= privatefield.get(myobject); //プライベートフィールドプライベートフィールドにアクセスしてください。 //プライベートフィールドの変更

    setAccessible(true)を使用して慎重に実行する必要があります。アクセス修飾子をバイパスし、カプセル化を破壊する可能性があり、コードの予期せぬ結果につながります。一般的に、絶対に必要でない限り、プライベートメンバーに直接アクセスすることを避けるのが最善です。

    私のアプリケーションでJava反射を広範囲に使用することのパフォーマンスへの影響は何ですか?その理由は次のとおりです。
    • ダイナミックルックアップ:リフレクションには、クラスとメンバーのランタイム検索が含まれます。 JVMはコンパイル時に詳細を知らないため、これは直接的な静的アクセスよりも遅いです。
    • セキュリティチェック: JVMは反射中にセキュリティチェックを実行し、オーバーヘッドを追加します。反射はこの最適化を妨げ、効率の低いマシンコードにつながります。
    • メモリ消費量の増加:反射は、特に多くのオブジェクトを動的に作成するために使用される場合、メモリ使用量を増やす可能性があります。アプリケーションのパフォーマンスが批判的な部分の場合、直接メソッド呼び出しと静的アクセスが常に推奨されます。動的動作が絶対に不可欠であり、パフォーマンスコストが許容される場合にのみ反射を検討してください。

      Java反射を使用して、実行時に異なるクラスのオブジェクトを動的にインスタンス化するにはどうすればよいですか?方法は次のとおりです。 //構成ファイル、ユーザー入力などからこれを取得します。クラス&lt;?&gt; myclass = class.forname(className); Constructor&lt;?&gt; constructor = myclass.getConstructor(string.class、int.class); // constructorパラメーターを指定しますobject byobject = constructor.newinstance(&quot; hello&quot;、123); //オブジェクトをインスタンス化

      このコードスニペットは、 className で指定されたクラスのインスタンスを動的に作成します。 getConstructor メソッドは、パラメータータイプに基づいて適切なコンストラクターを見つけます。 newinstance メソッドは、そのコンストラクターを使用してクラスのインスタンスを作成します。 classNotFoundException nosuchmethodexception instantiationexception などの潜在的な例外を忘れないでください。このアプローチを使用すると、コード内のクラス名をハードコードする必要なく、ランタイム情報に基づいてさまざまなクラスのオブジェクトを作成できます。これは、フレームワークとプラグインアーキテクチャで特に役立ちます。

以上がJava Reflectionを使用して、実行時にクラスを検査および操作するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート