Java反射によるクラス情報の表示例

5454 ワード

この例では、Javaが反射によってクラスを表示する情報について説明します.皆さんの参考にしてください.具体的には以下の通りです.
ほんの少し
1反射によるClassオブジェクトの取得
ClassクラスのforName()スタティックメソッドを使用します.このメソッドでは、クラスの全限定クラス名である文字列パラメータを入力する必要があります(完全なパッケージ名を追加する必要があります).
クラスのクラス属性を呼び出して、クラスに対応するクラスオブジェクトを取得します.例えばPerson.クラスはPersonクラスに対応するクラスオブジェクトを返します.
オブジェクトを呼び出すgetClass()メソッド.java.lang.Objectクラスのメソッドの1つであるため、すべてのJavaオブジェクトがメソッドを呼び出すことができ、このメソッドはオブジェクトが属するクラスに対応するClassオブジェクトを返します.
2 Classから情報を取得
コンストラクタの取得
クラスに対応するクラスへのアクセス方法
クラスに対応するクラスに含まれる属性へのアクセス(Field)
クラスに対応するクラスに含まれるコメントにアクセスします.
クラスオブジェクト対応クラスに含まれる内部クラスにアクセスします.
クラスオブジェクトに対応するクラスが存在する外部クラスにアクセスします.
このクラスオブジェクトに対応するクラスが継承した親、実装されたインタフェースなどにアクセスします.
二実戦
1コード

import java.util.*;
import java.lang.reflect.*;
import java.lang.annotation.*;
//        
@Repeatable(Annos.class)
@interface Anno {
}
@Retention(value = RetentionPolicy.RUNTIME)
@interface Annos {
  Anno[] value();
}
//   4       
@SuppressWarnings(value = "unchecked")
@Deprecated
//           
@Anno
@Anno
public class ClassTest {
  //              
  private ClassTest() {
  }
  //            
  public ClassTest( String name ) {
    System.out.println("         ");
  }
  //         info  
  public void info() {
    System.out.println("      info  ");
  }
  //         info  
  public void info( String str ) {
    System.out.println("      info  "
        + ", str   :" + str);
  }
  //            
  class Inner {
  }
  public static void main( String[] args )
      throws Exception {
    //         ClassTest   Class
    Class clazz = ClassTest.class;
    //    Class            
    Constructor[] ctors = clazz.getDeclaredConstructors();
    System.out.println("ClassTest        :");
    for (Constructor c : ctors) {
      System.out.println(c);
    }
    //    Class         public   
    Constructor[] publicCtors = clazz.getConstructors();
    System.out.println("ClassTest   public     :");
    for (Constructor c : publicCtors) {
      System.out.println(c);
    }
    //    Class         public  
    Method[] mtds = clazz.getMethods();
    System.out.println("ClassTest   public    :");
    for (Method md : mtds) {
      System.out.println(md);
    }
    //    Class           
    System.out.println("ClassTest          info()   :"
        + clazz.getMethod("info", String.class));
    //    Class             
    Annotation[] anns = clazz.getAnnotations();
    System.out.println("ClassTest   Annotation  :");
    for (Annotation an : anns) {
      System.out.println(an);
    }
    System.out.println(" Class    @SuppressWarnings   :"
        + Arrays.toString(clazz.getAnnotationsByType(SuppressWarnings.class)));
    System.out.println(" Class    @Anno   :"
        + Arrays.toString(clazz.getAnnotationsByType(Anno.class)));
    //    Class            
    Class>[] inners = clazz.getDeclaredClasses();
    System.out.println("ClassTest        :");
    for (Class c : inners) {
      System.out.println(c);
    }
    //   Class.forName    ClassTest Inner   
    Class inClazz = Class.forName("ClassTest$Inner");
    //   getDeclaringClass()          
    System.out.println("inClazz        :" +
        inClazz.getDeclaringClass());
    System.out.println("ClassTest   :" + clazz.getPackage());
    System.out.println("ClassTest    :" + clazz.getSuperclass());
  }
}


2運転
ClassTestの全コンストラクタは以下の通りである:private ClassTest()public ClassTest(java.lang.String)ClassTestの全publicコンストラクタは以下の通りである:public ClassTest(java.lang.String)ClassTestの全publicメソッドは以下の通りである:public static void ClassTest.main(java.lang.String[]) throws java.lang.Exception public void ClassTest.info(java.lang.String) public void ClassTest.info() public final void java.lang.Object.wait() throws java.lang.InterruptedException public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException public boolean java.lang.Object.equals(java.lang.Object) public java.lang.String java.lang.Object.toString() public native int java.lang.Object.hashCode() public final native java.lang.Class java.lang.Object.getClass() public final native void java.lang.Object.notify() public final native void java.lang.Object.notifyAll()ClassTestに文字列パラメータを持つinfo()メソッドは、public void ClassTest.info(java.lang.String)ClassTestのすべてのAnnotationは以下の通りです:@java.lang.Deprescated()@Annos(value=[@Anno(),@Anno()])このClass要素上の@SuppressWarnings注記:[]このClass要素上の@Anno注記:[@Anno(),@Anno()]ClassTestのすべての内部クラスは、class ClassTest$Inner inClazz対応クラスの外部クラス:class ClassTest ClassTestのパッケージ:null ClassTestの親クラス:class java.lang.Object
Javaに関する詳細に興味のある読者は、「Javaオブジェクト向けプログラム設計入門と進級チュートリアル」、「Javaデータ構造とアルゴリズムチュートリアル」、「Java操作DOMノードテクニックまとめ」、「Javaファイルとディレクトリ操作テクニックまとめ」、「Javaキャッシュ操作テクニックまとめ」のトピックを参照してください.
本文で述べたjavaプログラム設計に役立つことを願っています.