Java反射メカニズムは、任意のクラスの場合、このクラスのすべてのプロパティとメソッドを呼び出すことができます。オブジェクトメソッドは、Java言語の反射メカニズムと呼ばれます。反射の概念は、1982年にスミスによって最初に提案されました。主に、プログラムが独自の状態または行動にアクセス、検出、変更できる能力を指します。この概念の提案は、コンピューターサイエンスの分野での応用反射率に関する研究を迅速に引き起こしました。これは、プログラミング言語設計の分野で最初に採用され、LISPおよびオブジェクト指向の成果を達成しました。もちろん、それ自体は新しい概念ではありません。
Java反射メカニズムは、主に次の用途を提供します。
実行時にすべてのオブジェクトが属するクラスを決定する
実行時に任意のクラスのオブジェクトを作成します
実行時にクラスのメンバー変数と方法を決定する
実行時にすべてのオブジェクトのメソッドを呼び出します
まず、簡単な例を見て、この例を使用して、Javaの反射メカニズムがどのように機能するかを理解しましょう。
パッケージcom.wanggc.Reflection; Import java.lang.Reflect.Method;/*** Java反射演習。 * * @author wanggc * /public class fornametest { /** *エントリ関数。 * * @param args *パラメーター * @throws例外 *エラーメッセージ */ public static void main(string [] args)スロー例外{// class class <?> cls = class.fornam e(args [0]); / / classメソッドを使用して対応するオブジェクトを取得= cls.getMethods();渡されたパラメーターがjava.lang.stringの場合、次の結果は出力されます
public boolean java.lang.string.equals(java.lang.object)public java.lang.string java.lang.string.tostring()public int java.lang.string.hashcode()public int java.lang.string 。 int)public int java.lang.string.indexof(java.lang.string)public java.lang.string.indexof(java.lang.string、int)public static java.lang.string java.lang .string.valueof (int)public static java.lang.string java.lang.string.valueof(char)public static java.lang.string java.lang.string java.lang.string.valueof(boolean)public static java.lang.st Ringリングjava.lang.string.valueof(float)public static java.lang.string java.lang.string.valueof(char []、int、int、int)public static java.lang.string java.string.string.valueof(double)(double) public s tatic java.lang.string java .lang.string.valueof(char [])public static java.lang.string java.lang.string.valueof(java.lang.object)public static java.lang.string java。 Lang.String。 string.codepointcount(int、int)public int java.lang.string.comparetoignorecase(java.lang.string)public java.lang.string java.lang.string.concat(java.lang.string)public boolean java.lang .String .Contains(Java.Lang.Charsequence)Public Boolean Java.lang.String.ContentEquals(java.lang.charecence)public boolean java.lang.string.contentequals(java.lang.stringbuffer)public stati c java.lang。 String Java.lang.String.CopyValueof(char [])public static java.lang.string java.lang.string.copyvalueof(char []、int、int)public boolean java.lang.string.endswith(java.lang。 string)public boolean java.lang.string.equalsignorecase(java.lang.string)public static java.lang.string java.lang.string.format(java.lang.string、java.lang.object [])public static java .lang.string java.lang.st ring.format(java.util.locale、java.lang.string、java.lang.object [])public byte [] java.lang.string.getBytes(java.lang.string )Java.io.Unsupportedenc OddexceptionPublic void Java.lang.getBytes(int、int、byte []、int)public byte [] java.lang.string.getBytes()public byte [] java.lang.string。 getBytes(java.nio.charset.char set)public void java .lang.string.getchars(int、int、char []、int)public native java.lang.string java.lang.string.intern()public boolean java .lang.string.isempty()public int j ava.lang.lastindexof(java.lang.string)public java.lang.string.lastindexof.lang.string.lastindexof(int )public int java.lan G.String.lastIndexof(java.lang。string、int)public int java.lang.string.length()public boolean java.lang.string.matches(java.lang.string)public int java .lang.string.offsetbycodepoin ts(int、int)public boolean java.lang .string.regionmatches(boolean、int、java.lang.string、int、int、int)public boolean java.lang.string.regionmatches(int、 Java.lang.String、int、int、int)public java.lan G.String java.lang .String.Replace(java.lang.charescence、java.lang.charecaince)public java.lang.String java.lang.string.Replace (char、char、char)public java.lang.string java .lang.string.replaceall(java .lang.string、java.lang.string)public java.lang.string java.lang.string.ReplaceFirst(java.lang.String 、java.lang.string)public java.lang.string [] java.lan G.String .split(java.lang.string)public java.lang.string [] java.lang.string.split(java.lang。 string、int)public boolean java.lang.string.startswith(java.lang.st ring)public boolean java.lang.string.startswith(java.lang.string、int)public java.lang.charescence java.lang.string .subsequence(int、int)public java.lang.string j ava.lang.string.substring(int)public java.lang.string java.lang.string.substring(int、int)public char [] java.lang。 string.tochararray()public java.lang.string java.lang.string.tolow ercase()public java .String java.lang.string.touppercase()public java.lang.string java.lang.string ing.touppercase(java.util。locale)public java.lang.string java.lang.string.trim()public final native void java.lang.object.wait(long)throws java.lang.interrupdexceptionpub lic final void java.lang.object.wait()throws java .lang.interrupdedexceptionpublic final void java.lang.object.wait(long、)shrows shrows java.lang.interruptedexceptionpublic final native java.lang.cla ss java.lang.object.getclass()public final native void java.lang.object.notifyall()
これには、すべてのメソッド名、それらの制限文字、返品タイプ、およびJava.lang.Stringクラスの例外をスローします。このプログラムでは、クラスクラスのフォーネームメソッドを使用して指定されたクラスをロードし、GetMethodsメソッドを呼び出して指定されたクラスのメソッドリストを返します。 Java.lang.Reflect.Methodは、特定のクラスで単一の方法を表現するために使用されます。
Javaの反射メカニズムを使用するには、一般に3つのステップが必要です。
クラスの操作の2番目のステップで取得したクラスのメソッドまたは属性を取得するために、最初のステップで取得したクラスオブジェクトを介してクラスを操作するクラスオブジェクトを取得します。
Javaが実行されているとき、特定のクラスが生成するオブジェクトの数に関係なく、それらは実行中のプログラムのクラスとインターフェイスを表す同じクラスオブジェクトに対応します。操作クラスのクラスオブジェクトを取得するには、次の3つの一般的な方法があります。
上記の例に示すように、クラスの静的メソッドfornameを呼び出します。
クラス<?> cls = string.classなど、クラスのクラス構文を使用します。
string str = "abc";
以下は、上記の3つのステップを介してオブジェクトの特定の方法を実行する方法を説明するために例を使用します。
パッケージcom.wangc.Reflection; * * @author wangc */ public class refectiontest {public static void main(string [] args){display display = new display();クラスメソッドの表示方法= cls.getMethod( "show"、string.class); void show(string name){system.out.println( "hello:" + name)};前述のように、Javaプログラムの各クラスには、それに対応するクラスオブジェクトがあります。 Java反射の最初のステップは、14行のコードなどのこのクラスオブジェクトを取得することです。もちろん、各クラスのメソッドには、それに対応するメソッドオブジェクトも必要です。反射を通じてこのメソッドを呼び出すには、最初にコードの行16などのこのメソッドのメソッドオブジェクトを取得し、次にコードの行18などのメソッドオブジェクトを使用してこのメソッドを順番に呼び出す必要があります。 16行目のgetMethodメソッドの最初のパラメーターはメソッド名であり、2つ目は複数のパラメーターがある場合は、getMethodがバリアードパラメーターメソッドであるため、パラメーターを追加します。 18行のコードを実行します。これは、実際には、Invokeの最初のパラメーターが表示クラスのオブジェクトであることに注意してくださいパラメーターは、それをshowメソッドに渡すことです。タイプと数は、16行のgetMethodメソッドと一致する必要があります。
上記の例は、リフレクションを介して特定のクラスの方法を呼び出す方法を示しています。
パッケージcom.wangg.Reflection; * * @author wanggc */ public class refectiontest {public static void main(string [] args)throws exception {// create student student student = new Student.setstuname( "wangg"); ; StudentStuage(); ) + ":" + deststudent.getStuage()); ***学生オブジェクト情報をコピーします。 * * @param fromソースオブジェクト * @param dest *ターゲットオブジェクトをコピー * @throws例外 *例外 */ private static void copybean(from、object dest)スロー例外{//コピーのクラスオブジェクトを取得しますソースオブジェクトクラス<?> from.getClass(); > destclass = dest.getClass();ターゲットオブジェクトの名前destclass.getDeclaredfield(name)fromfield.setAccessible(true);コピーの対応する属性にオブジェクトターゲットオブジェクトDestfield.set(Dest、Fromfield。::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::づ 火::::: ::::::::::::::::::::::::::::::::::::::::::::::g get(from))) ; * / class Student { / ** name* / ** age* / private int stuage; ** @return name*/ public string getstuname(){return stuname; } / ***学生年齢** @return age* / public int getStuage(){return stuage; ){this.stuage = stuage;Javaの起動メカニズムでは、クラスはクラスに対応し、クラスメソッドはメソッドに対応し、もちろんプロパティもフィールドに対応します。コードのコメントは詳細にコメントされており、ここでは繰り返されません。ただし、フィールドは属性の値を取得および設定する方法を取得および設定していることに注意してください。ただし、属性はプライベートタイプであるため、属性のアクセシビリティは、行50〜51のようにTrueに設定する必要があります。コード。また、フィールド全体のアクセシビリティを設定し、AccessibleObject.SetAccessible(FromFields、True)など、40行でAccessibleObject SetAccessableの静的方法を使用することもできます。
前の説明は、Java反射メカニズムを使用して、クラスの方法とプロパティを操作する方法を示しています。
パッケージcom.wangg.Reflection; * * @author wanggc */ public class refectiontest {public static void main(string [] args)throws exception {// create student student student = new Student.setstuname( "wangg"); ; StudentStuage(); ()); ***学生オブジェクト情報をコピーします。 * * @param from Source Object * @param dest *ターゲットオブジェクトをコピー * @throws例外 *例外 */ private static object copybean(オブジェクトから)スロー例外{//ソースオブジェクトクラスのコピークラスオブジェクトを取得します< ?> fromclass = from.getclass(); (); field:fromfields){// fromfield.setAccessible(true)のアクセシビリティを設定します。 set(ints、fromfield.get(from)); * / class Student { / ** name* / ** age* / private int stuage; ** @return name*/ public string getstuname(){return stuname; } / ***学生年齢** @return age* / public int getStuage(){return stuage; ){this.stuage = stuage;この例と前の例の結果は同じです。ただし、CopyBeanメソッドによって返されたオブジェクトは、外側に渡されなくなりましたが、40行目のコードに示すように、メソッドによって内部的に生成されます。注:クラスのNewInstanceメソッドは、特定のクラスにパラメーターのみのあるコンストラクターのみを含むクラスのみを作成できます。 wanggc ");
この時点で、Java反射メカニズムの一般的な機能(実行時にオブジェクトを呼び出す方法、クラス属性の使用、およびクラスオブジェクトの作成)が導入されています。
サプリメント:クラスのメソッド、プロパティ、およびコンストラクターを取得する場合、対応する2つの方法があります。GetXXXとgetGetDeclaredXXXです。違いは、前者が親クラスのものを含むアクセス権を含む方法とプロパティを返すことです。
上記のコンテンツは、あなたに紹介されたJava起動メカニズムです。あなたがそれを気に入っていただければ幸いです。