Java リフレクション です 実行時にクラスの実行時の動作を検査または変更するプロセス 。
の java.lang.クラス class には、メタデータの取得、クラスの実行時の動作の検査および変更に使用できるメソッドが多数用意されています。
星柄をプリント
java.lang および java.lang.reflect パッケージは、Java リフレクション用のクラスを提供します。
使用される場所
Reflection API は主に次の用途で使用されます。
- IDE (統合開発環境) 例: Eclipse、MyEclipse、NetBeans など。
- デバッガ
- テストツールなど
- Class クラスのインスタンスを取得する方法は何通りありますか?
- Javapツールを作成するにはどうすればよいですか?
- アプレットビューアツールを作成するにはどうすればよいですか?
- クラスの外からプライベートメソッドにアクセスするにはどうすればよいですか?
java.lang.Classクラス
java.lang.Class クラスは主に 2 つのタスクを実行します。
- 実行時にクラスのメタデータを取得するメソッドを提供します。
- クラスの実行時の動作を調べて変更するメソッドを提供します。
Class クラスの一般的に使用されるメソッド:
方法 | 説明 |
---|---|
1) パブリック文字列 getName() | クラス名を返します |
2) public static Class forName(String className)throws ClassNotFoundException | クラスをロードし、Class クラスの参照を返します。 |
3) public Object newInstance()throws InstantiationException、IllegalAccessException | 新しいインスタンスを作成します。 |
4) パブリックブール値 isInterface() | インターフェイスかどうかを確認します。 |
5) パブリックブール値 isArray() ; | 配列かどうかをチェックします。 |
6) パブリックブール値 isPrimitive() | プリミティブかどうかをチェックします。 |
7) パブリッククラス getSuperclass() | スーパークラスのクラス参照を返します。 |
8) public Field[] getDeclaredFields()throws SecurityException | このクラスのフィールドの総数を返します。 |
9) public Method[] getDeclaredMethods()throws SecurityException | このクラスのメソッドの総数を返します。 |
10) public Constructor[] getDeclaredConstructors()throws SecurityException | このクラスのコンストラクターの総数を返します。 |
11) public メソッド getDeclaredMethod(String name,Class[]parameterTypes)throws NoSuchMethodException,SecurityException | メソッドクラスのインスタンスを返します。 |
Classクラスのオブジェクトを取得するにはどうすればよいでしょうか?
Classクラスのインスタンスを取得するには3つの方法があります。それらは次のとおりです。
- ClassクラスのforName()メソッド
- オブジェクトクラスのgetClass()メソッド
- .class 構文
1) ClassクラスのforName()メソッド
- クラスを動的にロードするために使用されます。
- Class クラスのインスタンスを返します。
- クラスの完全修飾名がわかっている場合に使用する必要があります。プリミティブ型には使用できません。
forName() メソッドの簡単な例を見てみましょう。
ファイル名: テスト.java
class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } }
出力:
Simple
2) オブジェクトクラスのgetClass()メソッド
Class クラスのインスタンスを返します。種類がわかっている場合は使用するとよいでしょう。さらに、プリミティブでも使用できます。
ファイル名: テスト.java
class Simple{} class Test{ void printName(Object obj){ Class c=obj.getClass(); System.out.println(c.getName()); } public static void main(String args[]){ Simple s=new Simple(); Test t=new Test(); t.printName(s); } }
出力:
Simple
3) .class 構文
型は使用できるがインスタンスがない場合は、型の名前に「.class」を追加することでクラスを取得できます。プリミティブ データ型にも使用できます。
ファイル名: テスト.java
class Test{ public static void main(String args[]){ Class c = boolean.class; System.out.println(c.getName()); Class c2 = Test.class; System.out.println(c2.getName()); } }
出力:
boolean Test
クラスオブジェクトの決定
Class クラスの次のメソッドは、クラス オブジェクトを決定するために使用されます。
1) パブリックブール値 isInterface(): 指定された Class オブジェクトがインターフェイス タイプを表すかどうかを判断します。
2) パブリックブール値 isArray() ; この Class オブジェクトが配列クラスを表すかどうかを決定します。
3) パブリックブール値 isPrimitive(): 指定された Class オブジェクトがプリミティブ型を表すかどうかを決定します。
AWSSNS
オブジェクトのタイプを決定するリフレクション API の簡単な例を見てみましょう。
ファイル名: テスト.java
class Simple{} interface My{} class Test{ public static void main(String args[]){ try{ Class c=Class.forName('Simple'); System.out.println(c.isInterface()); Class c2=Class.forName('My'); System.out.println(c2.isInterface()); }catch(Exception e){System.out.println(e);} } }
出力:
false true
リフレクションの長所と短所
Java リフレクションは常に注意して使用する必要があります。反射には多くの利点がありますが、いくつかの欠点もあります。まず利点について説明しましょう。
長所: コンパイル時に名前を使用しなくても、リフレクションを使用して実行時にインターフェイス、クラス、メソッド、フィールドを検査できます。メソッドを呼び出したり、クリアをインスタンス化したり、リフレクションを使用してフィールドの値を設定したりすることもできます。これは、開発者が正しいコードを書くのを支援するビジュアル開発環境とクラス ブラウザの作成に役立ちます。
短所: リフレクションを使用すると、カプセル化の原則を破ることができます。リフレクションを使用してクラスのプライベート メソッドとフィールドにアクセスすることができます。このため、反射により重要なデータが外部に漏洩する可能性があり危険です。たとえば、あるユーザーがクラスのプライベート メンバーにアクセスしてそれに null 値を設定すると、同じクラスの他のユーザーが NullReferenceException を受け取る可能性があり、この動作は予期されていません。
もう 1 つのデメリットは、パフォーマンスのオーバーヘッドです。リフレクションの型は動的に解決されるため、JVM (Java Virtual Machine) の最適化は実行できません。したがって、リフレクションによって実行される操作は通常遅くなります。
結論
上記の欠点があるため、一般的にはリフレクションの使用を避けることをお勧めします。これは高度な機能であり、言語の基本を十分に理解しているプログラマーまたは開発者のみが使用する必要があります。常に覚えておいてください!リフレクションを使用すると、アプリケーションのセキュリティが危険にさらされます。
Reflection API チュートリアルの次のトピック
newInstance() メソッドJavapツールを理解する
Javapツールを作成しています
アプレットビューアツールの作成
別のクラスからプライベート メソッドを呼び出す