この記事では、Javaプログラミングリフレクションメカニズムの使用について説明します。次のように、参照のために共有してください。
序文:リフレクション:クラス(この記事ではperson.classなどのバイトコードファイル)を動的に取得し、そのメンバーを実行します。 Androidアプリケーション層の開発では、反射がわずかに遭遇しない場合がありますが、基礎となる層を通り抜けたい人にとっては、それを使用するのに習熟している必要があります。
エンティティクラス
person.java
パッケージcom.sunwenou.reflt; //パッケージ名public class person {private string name;プライベートインクエイジ; public Person(){//パラメーターなし} public Person(string name、int age){// parameter super(); this.name = name; this.age = age; } public string getname(){return name; } public void setName(string name){this.name = name; } public int getage(){return age; } public void Setage(int age){this.age = age; } @Override public String toString(){return name+"、"+age; } public void show(){// empty parameter system.out.println( "show"); } public void fun(string ss){// parameter system.out.println(ss); } public static void function(){// static system.out.println( "static"); }}バイトコードファイルを動的に取得する方法
ブログ投稿を簡潔に見せるために、例外がスローされ、インポートが省略されます。
パッケージcom.sunwenou.reft; public class demo1 { /*** [bytecodeファイル]を動的に取得する方法* 1:オブジェクトクラスによって提供されるクラスgetclass()メソッドを使用*パッケージ名 +クラス名*/public static void main(string [] args)throws exception {// getclaz();で構成される文字列が必要です。 // getCalz2(); getclaz3(); } // class class public static void getclaz3()スロー例外{class <?> claz = class.forname( "com.sunwenou.reflect.person"); class <? System.out.println(claz == claz2); } //各データ型には、静的クラス属性がありますpublic static void getCalz2(){class <person> p1 = person.class;クラス<パーソン>p2 = person.class; System.out.println(p1 == p2); } //オブジェクトクラスで提供されたクラスgetClass()メソッドを使用しますpublic static void getclaz(){person person1 = new person();クラス<?人> claz = person1.getclass(); // person.class person2 = new person();クラス<? person> claz2 = person2.getclass(); // person.class system.out.println(claz == claz2); }}クラスを動的に取得し、オブジェクトを作成します
パッケージcom.sunwenou.reflt; public class demo2 {public static void main(string [] args)throws exception {// createobj(); createobj2(); } public static void createobj2()throws exception {// person person = new person( "lisi"、23); // bytecodeファイルオブジェクトクラスを取得<? //person.class //パラメーターを備えたコンストラクターメソッドが属するタイプコンストラクターのオブジェクトを取得します。 Constructor constructor = claz.getConstructor(String.Class、int.class); //コンストラクタークラスの人が提供するオブジェクトを作成する方法を使用してオブジェクトを作成します。 System.out.println(person); } public static void createobj()スロー例外{// person person = new person(); // bytecodeファイルオブジェクトクラスを取得<?オブジェクトobj = claz.newinstance(); //デフォルトでは、空のパラメーターのコンストラクターを使用してオブジェクトSystem.out.println(obj)を作成します。 }}クラスを動的に取得し、メンバー変数に値を割り当てます
パッケージcom.sunwenou.reflt; public class demo3 {public static void main(string [] args)throws exception {// person p = new person(); //p.name = "lisi"; // bytecodeファイルオブジェクトクラスを取得<? //メンバー変数が属するフィールドタイプのオブジェクトを取得します//フィールドフィールド= claz.getfield( "name"); //パブリック許可フィールドを使用してメンバーを取得= claz.getDeclaredField( "name"); //すべての宣言されたフィールドSystem.out.println(field); //非静的なメンバー変数は、オブジェクトに依存するオブジェクトobj = claz.newinstance(); field.setAccessible(true); //ブルートフォースの亀裂、アクセス可能なfield.set(obj、 "zhang san")に設定されています。 System.out.println(obj); }}クラスを動的に取得し、メソッドを実行します
パッケージcom.sunwenou.reflt; public class demo4 {public static void main(string [] args)throws exception {// method1();方法2();方法3(); } public static void method3()throws exception {// bytecode file object class <?方法M = claz.getMethod( "function"、null); M.Invoke(null、null); } ///パラメーターでメソッドを実行するpublic static void method2()throws exception {// bytecode file object class <?> claz = class.forname( "com.sunwenou.reflect.person");方法m = claz.getMethod( "fun"、string.class);オブジェクトobj = claz.newinstance(); M.Invoke(obj、 "hello"); } //パラメーターなしでメソッドを実行するpublic static void method1()throws exception {// person person = new Person(); person.show(); // bytecodeファイルオブジェクトクラスを取得<? //実行されたメソッドが属するbytecodeファイルオブジェクトを取得します。方法m = claz.getmethod( "show"、null); //非静的な方法は、オブジェクトに依存するオブジェクトobj = claz.newinstance(); //メソッドm.invoke(obj、null)を実行します。 }}これは、反射の基本的な使用法です。オブジェクトを正常に作成して実行できない場合、オブジェクトのbytecodeファイルを介してオブジェクトを作成できます。あなたはそれをする方法を学びましたか? ?
Java関連のコンテンツの詳細については、このサイトのトピックをご覧ください:「Javaオブジェクト指向プログラミングに関する紹介と高度なチュートリアル」、「Javaデータ構造とアルゴリズムに関するチュートリアル」、「Java Operation Dom Nodeスキルの概要」、「Javaファイルとディレクトリ操作スキルの要約」、Java Cache操作スキルの概要」
この記事がみんなのJavaプログラミングに役立つことを願っています。