クラスリフレクションデモ
次のようにコードをコピーします。
パッケージの反射。
@非推奨
パブリック クラス ReflectionDemo {
プライベート文字列pri_field;
パブリック文字列 pub_field;
パブリック ReflectionDemo(){}
public ReflectionDemo(文字列名){}
private ReflectionDemo(文字列名,int int1){}
public void ReflectMethod(){}
public void ReflectMethod(String str){}
private void ReflectMethod(int int1){}
クラス innerclss_Refection{}
}
テストクラスReflectionDemoTest
次のようにコードをコピーします。
パッケージの反射。
インポート java.lang.annotation.Annotation;
インポート java.lang.reflect.Constructor;
java.lang.reflect.Fieldをインポートします。
java.lang.reflect.Methodをインポートします。
パブリック クラス ReflectionDemoTest {
public static void main(String[] args) {
//クラスオブジェクトを作成し、強制的な転送を避けるために汎用的な変更を使用します
クラス cla=ReflectionDemo.class;
//パブリックフィールドをすべて取得するメソッド
フィールド[] フィールド=cla.getFields();
for(フィールド f:フィールド){
System.out.println("すべてのパブリック フィールドを取得するメソッド:"+f.toString());
}
//指定したパブリックドメインを取得するメソッド
試す {
フィールド field1=cla.getField("pub_field");
System.out.println("指定されたパブリックフィールドを取得するメソッド:"+field1.toString());
} catch (SecurityException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
//全ドメイン(プライベートドメイン含む)を取得するメソッド、宣言
フィールド[] フィールド2=cla.getDeclaredFields();
for(フィールド f:フィールド2){
System.out.println("全フィールド(プライベートフィールド含む)を取得するメソッド:"+f.toString());
}
//指定したドメイン(プライベートドメイン含む)を取得するメソッド
試す {
フィールド field3=cla.getDeclaredField("pri_field");
System.out.println("指定されたフィールド(プライベートフィールドを含む)を取得するメソッド:"+field3.toString());
} catch (SecurityException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
//すべてのパブリック メソッド (親クラスを含む) を取得します
メソッド[] メソッド=cla.getMethods();
for(メソッドm:メソッド){
System.out.println("すべてのパブリック メソッドを取得:"+m.toString());
}
試す {
//指定されたパラメータのないメソッドを取得します
// 2 番目のパラメータはパラメータのタイプを示し、パラメータ NUll はパラメータなしのメソッドを示します。
メソッド method1=cla.getMethod("ReflectMethod", null);
System.out.println("パラメータなしでパブリック メソッドのメソッドを取得:"+method1.toString());
} catch (SecurityException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
//このクラス(親クラスを除く)のすべてのメソッドを取得するメソッド
メソッド[] メソッド2=cla.getDeclaredMethods();
for(メソッドm:メソッド2){
System.out.println("すべてのメソッド (親クラスを含む) を取得します:"+m.toString());
}
//このクラス(親クラスを除く)の指定メソッドのメソッドを取得
//最初のパラメータはメソッド名、2 番目のパラメータはメソッドの戻り値の型、NULL はパラメータのないメソッドです。
試す {
メソッド method3=cla.getDeclaredMethod("ReflectMethod",int.class);
System.out.println("このクラス(親クラスを除く)の指定メソッドのメソッドを取得:"+method3);
} catch (SecurityException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
//パブリックコンストラクターを取得する
//パラメータなしでパブリックコンストラクタを取得します
試す {
コンストラクター cs=cla.getConstructor(null);
System.out.println("パラメータのないコンストラクタを取得します:"+cs);
} catch (SecurityException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
//パラメータ付きのパブリックコンストラクタを取得します
//複数のパラメータを持つコンストラクタがある場合は、順序に注意してください。
試す {
コンストラクター cs=cla.getConstructor(String.class);
System.out.println("パラメータ化されたコンストラクタを取得します:"+cs);
} catch (SecurityException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
//すべての構築メソッドを取得します
試す {
Constructor[] cs=cla.getDeclaredConstructors();
for(コンストラクター c:cs){
System.out.println("すべての構築メソッドを取得:"+c);
}
} catch (SecurityException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
//パッケージ名を取得する
パッケージパック=cla.getPackage();
System.out.println("現在のパッケージの名前を取得します:"+pack);
// コメントを取得する
注釈[] ann=cla.getAnnotations();
for(注釈 an:ann){
System.out.println(an.toString());
}
//親クラスを取得する
クラス supercla=cla.getSuperclass();
System.out.println(supercla);
// 内部クラスを取得する
Class[] innercla=cla.getDeclaredClasses();
for(クラス cl:innercla){
System.out.println(cl);
}
}
}
概要: Class オブジェクトに関する情報を取得する手順:
1. Class オブジェクトを作成します。 メソッド 1 クラス cla=Class.forName(“PATH”) メソッド 2 CLass cla=Instance.getclass(); メソッド 3 クラス cla=Class.class
2. フィールド、メソッド、コンストラクター、パッケージ、およびアノテーションを使用して、cla.getXXXX メソッドを呼び出して関連情報を取得します。
3. 親クラスと内部クラスの取得方法が少し異なります。
4. cla.getMethods を使用すると、クラスと親クラスのすべてのパブリック メソッドが呼び出されます。
5. Declared を使用すると、プライベート メソッドを含むクラスのすべてのメソッドが呼び出されます。これはドメインとコンストラクターにも当てはまります。
6. リフレクション クラスにパブリック コンストラクターがなく、newInstance メソッドを直接使用できない場合は、
Method cs=cla.getMethod("getInstance",null);//メソッドを取得する
Calendar Calendar=(Calendar) cs.invoke(cla, null);//取得したメソッドを実行、パラメータ1は実行メソッドのオブジェクト、パラメータ2はメソッドのパラメータを表す
日付 df=calendar.getTime();
System.out.println(df.toString());
取得するため。