1。はじめに
Java Reflectionは、実行時にクラスメソッド、プロパティ、親クラス、インターフェイスなどの内部情報を取得できるメカニズムです。言い換えれば、反射は本質的に「逆」プロセスです。 newクラスを介してクラスのインスタンスを作成すると、実際には実行時にこのクラスのClassオブジェクトに基づいてJava仮想マシンによって構築され、反射はクラスのClassオブジェクトを介して定義情報を取得して、そのプロパティとメソッドにアクセスし、このクラスの親クラスを知ることができます。
2。クラス
Javacを使用すると、.javaファイルを.classファイルにコンパイルできることがわかっています。クラスファイル(親クラス、インターフェイス、コンストラクター、プロパティ、メソッドなど)の元の定義情報が含まれています。 .classファイルは、実行時にClassLoader Java仮想マシン(JVM)にロードされます。 .classファイルがロードされると、JVMはクラスオブジェクトを生成します。プログラム内の新しいオブジェクトは、実行時に対応するクラスオブジェクトに基づいて実際に構築されます。正確には、このクラスオブジェクトは、実際にはjava.lang.Class<T>汎用クラスのインスタンスです。たとえば、 Class<MyClass>オブジェクトは、 MyClassクラスの定義情報をカプセル化するClass<T>インスタンスです。 java.lang.Class<T>クラスにはパブリックコンストラクターがないため、このクラスを直接インスタンス化することはできません。次の方法でクラスオブジェクトを取得できます。
次の説明では、Peopleクラスと学生のクラスを例として受け取ります。
パブリッククラスの人々{プライベート文字列名;プライベートインクエイジ;パブリック(文字列名、int age){this.name = name; this.age = age; } public int getage(){return age; } public string getname(){return name; } public void Setage(int age){this.age = age; } public void setName(string name){this.name = name; } public void speak(){system.out.println(getname() + "" + getage()); }}パブリッククラスの学生は人を拡張します{private intグレード;パブリック学生(文字列名、int age){super(name、age); } public Student(string name、int age、int grad){super(name、age); this.grade = grade; } public int getGrade(){return grade; } public void setGrade(int grade){this.grade = grade; } private void Learn(String Course){System.out.println(name + "Learn" + course); }}クラス名でクラスオブジェクトを取得します
コンピレーション期間中にクラスの名前を知っている場合、次のようなクラスオブジェクトを取得できます。
class <people> peopleclass = people.class;
次のように、クラスのフルパス名に基づいてクラスオブジェクトを取得する方法もあります。
//人のクラスがcom.testパッケージクラス<people> peopleclass = class.forname( "com.test.people")にあるとします。
Class.forName()メソッドのパラメーターは、クラスのフルパス名でなければならないことに注意してください。実際、「com.test.peopleをインポートする」限り、フルパスを書き出すことなく「 People.class 」を介してクラスオブジェクトを直接取得できます。 ( Class.forName()メソッドを呼び出すときに、対応するクラスがclasspathにない場合、 ClassNotFoundExceptionがスローされます。)
オブジェクト自体を介してクラスオブジェクトを取得します
People People = New People( "Bill"、18); class <people> peopleclass = people.getClass();
リフレクションによってクラスのコンストラクターを取得します
Peopleのクラスオブジェクトを取得したら、このクラスオブジェクトを介してPeopleクラスの元の定義情報を取得できます。まず、 Peopleクラスのコンストラクターオブジェクトを取得しましょう。このコンストラクターオブジェクトを使用すると、 Peopleオブジェクトを構築できます。たとえば、dustent.javaに次のコードを追加できます。
public static void main(string [] args){class <people> pclass = people.class; try {constructor <people> constructor = pclass.getConstructor(string.class、int.class);人々の人々= constructor.newinstance( "bill"、18); obj.speak(); } catch(例外e){}}上記では、 getConstructorメソッドを呼び出して、 Peopleクラスのコンストラクターオブジェクトを取得します。コンストラクターは、型Stringとintの正式なパラメーターを取得したいので、 String.classとint.classを渡します。コンストラクターオブジェクトを使用すると、 newInstanceメソッドを呼び出してpeopleオブジェクトを作成できます。
これらのオブジェクトのメソッドを呼び出す前に、クラスのConstructor 、 Method 、およびFieldオブジェクトが反射を通じて取得される場合、このオブジェクトのaccessibleフラグは、反射速度を改善できるJava言語アクセスチェックをキャンセルするためにtrueに設定されていることに注意してください。次のコードに示されているように:
constructor <people> constructor = peopleclass.getConstructor(String.class、int.class); //コンストラクターのアクセス可能なプロパティを設定して、JavaアクセスCONSTRUCTOR.SESTACCESSIBLE(true)をキャンセルしてキャンセルします。
リフレクションを通じてクラスで宣言された方法を取得します
現在のクラスで宣言された方法を取得します(親クラスから継承されたものを除く)
現在のクラスで宣言されたすべての方法を取得するには、クラスでgetDeclaredMethods関数を使用できます。現在のクラス( private 、 public 、 static 、その他の方法を含む)ですべての方法が宣言されます。 Methodオブジェクトの配列を返し、各Methodオブジェクトはクラスで宣言されたメソッドを表します。指定されたメソッドを取得するには、 getDeclaredMethod(String name, Class...<T> parameterTypes)を呼び出すことができます。
次のコードに示されているように:
private static void showdeclaredmethods(){student student = new Student( "Bill"、18); //学生クラスによって宣言されたすべてのメソッドを取得します方法[] methods = susted.getClass()。getDeclaredMethods(); try {// LearnMethodオブジェクトを取得します(学習メソッドをカプセル化)メソッドLearnMethod = sustean.getClass()。getDecLaredMethod( "Learn"、string.class); //学習メソッドのパラメーターリストを取得し、クラスを印刷します<? for(class <?> class:paramclasses){system.out.println( "学習メソッドパラメーター:" + class.getName()); } //学習方法がprivate system.out.out.println(Learnmethod.getName() + "is private" + modifier.isprivate(Learnmethod.getModifiers()))であるかどうかを判断します。 // Learn Method LearnMethod.Invoke(desute、 "Java Reflection"); } catch(例外e){}}現在のクラスと親クラスで宣言されたパブリック方法を取得する
親クラスで宣言された現在のクラスとすべてのpublicメソッドを取得するには、 getMethods関数を呼び出し、指定されたpublicメソッドを取得するには、 getMethodメソッドを呼び出すことができます。次のコードをご覧ください。
private static void showmethods(){学生= new Student( "Mr.Simple"); //すべてのパブリックメソッド(学生自体を含む、親クラスから継承された)メソッド[] Methods = Student.GetClass()。getMethods(); {// getMethodを通じて公開方法のみを取得できることに注意してください。プライベート方法を取得しようとすると、例外がスローされます。メソッドLearnMethod = susted.getClass()。getMethod( "Learn"、string.class); } catch(例外e){}}リフレクションによってクラスで定義されている属性を取得します
属性の取得は、 getMethods() / getDeclaredMethods()メソッドへの呼び出しがgetFields() / getDeclaredFields()メソッドへの呼び出しに置き換えられることを除き、メソッドの取得に似ています。
現在のクラスで定義されている属性を取得します(親クラスから継承された属性を除く)
現在のクラスで定義されているすべての属性( private 、 public 、 staticなどのさまざまな属性を含む)を取得するには、クラスオブジェクトのgetDeclaredFields関数を呼び出すことができます。指定された属性を取得するには、 getDeclaredFieldを呼び出すことができます。
次のコードに示されているように:
private static void showdeclaredfields(){学生= new Student( "Bill"、18); //現在のクラスフィールドで定義されているすべての属性を取得します[] fields = sustent.getClass()。getDeclaredFields(); try {//指定された属性フィールドGradefield = dustent.getClass()を取得します。GetDeclaredField( "Grade"); //属性値system.out.printlnを取得します( "グレードは:" + gradefield.getint(sudent)); //属性値gradefield.set(desute、10)を設定します。 } catch(例外e){}}現在のクラスと親クラスで定義されているパブリック属性を取得します
現在のクラスと親クラスで定義されているすべてのpublicプロパティを取得するには、 ClassオブジェクトのgetFields関数を呼び出すことができます。指定されたpublic財産を取得するには、次のコードに示すように、 getFieldメソッドを呼び出すことができます。
private static void showfields(){学生= new Student( "Bill"、18); //現在のクラスおよび親クラスフィールドのすべてのパブリックプロパティを取得します[] publicfields = sustent.getClass()。getFields(); }クラスの親クラスとクラスによって実装されたインターフェイスを取得するためのリフレクション
親クラスを取得します
次のコードに示すように、 ClassオブジェクトのgetSuperClassメソッドを呼び出すだけです。
学生学生= new Student( "Bill"、18); class <?> superclass = susteent.getClass()。getSuperclass();
実装されたインターフェイスを取得します
クラスがどのインターフェイスを実装するかを知るには、次のコードに示すように、 ClassオブジェクトのgetInterfacesメソッドを呼び出すだけです。
private static void showinterfaces(){学生= new Student( "Bill"、19); class <?要約します
上記は、この記事のコンテンツ全体です。みんなの勉強や仕事に役立つことを願っています。