JAva反射-クラス

4450 ワード

反射を使用すると、実行時にJavaクラスをチェックできます.検視クラスは通常、反射を使用するときに最初に行われることです.クラスから次の情報が得られます.
  • クラス名
  • クラス修飾子(private、public、synchronizedなど)
  • パッケージ情報
  • スーパークラス
  • 実装インタフェース
  • コンストラクタ
  • メソッド
  • 属性
  • 注記
  • Javaクラスには多くの情報が添付されており、JavaDoc for java.lang.Classで完全なリストを得ることができます.ここでは、上述したすべての情報に簡単にアクセスします.一部のトピックでは、章ごとにより詳細なチェックが行われます.たとえば、すべてのメソッドまたは特定のメソッドを取得する方法について説明しますが、そのメソッドを呼び出す方法、名前が同じメソッドで特定のパラメータのセットを一致させる方法、呼び出しメソッドを反射することによってどのような異常を投げ出すか、get/setを発見する方法など、章ごとに説明します.本文の主な目的はClassオブジェクトとあなたがそれを通じて得ることができる情報を紹介することです.Classオブジェクト
    クラスを検査する前に、検査されたクラスのjava.lang.Classオブジェクトを取得する必要があります.すべての元のタイプ(int、float、langなど)を含む配列(arrays)などのすべてのJavaタイプは、関連するClassオブジェクトを持っています.クラスのコンパイル時の名前を知っている場合は、次のコードでClassオブジェクトを取得できます.
    Class myObjectClass = MyObject.class

    クラスのコンパイル時の名前を知らないが、クラスの実行時の名前文字列を知っている場合は、次のコードを参照してください.
    String className = ... //obtain class name as string at runtime
    Class class = Class.forName(className);
    Class.forName()メソッドを使用する場合は、クラスのフルネームを指定する必要があります.フルリミット名には、すべてのパッケージ名が含まれます.例えば、MyObjectがパケットcom.jenkov.myappにある場合、そのフルネームはcom.jenkov.myapp.MyObjectである.Class.forName() メソッドは、実行時にclasspathパスの下でクラスが見つからない場合、ClassNotFoundException異常を放出します.
    クラス名Classオブジェクトには、2つのバージョンの名前が含まれています.パッケージ名を含むフルリミット名getName()メソッドを使用します.次のようにします.
    Class aClass = ... //obtain Class object. See prev. section
    String className = aClass.getName();

    応募を含まないクラス名を取得する必要がある場合は、 getSimpleName()メソッドを使用して次のように取得できます.
    Class  aClass          = ... //obtain Class object. See prev. section
    String simpleClassName = aClass.getSimpleName();

    修飾子Classオブジェクトを使用して、クラスの修飾子にアクセスできます.クラス修飾子キーワードはpublicprivate staticなどである.クラス修飾子を取得するコードは次のとおりです.
    Class  aClass = ... //obtain Class object. See prev. section
    int modifiers = aClass.getModifiers();

    修飾子はintにパッケージされ、各修飾子は設定またはクリアをマークする識別ビットである.java.lang.reflect.Modifierクラスの次の方法で修飾子をチェックできます.
    Modifier.isAbstract(int modifiers)
    Modifier.isFinal(int modifiers)
    Modifier.isInterface(int modifiers)
    Modifier.isNative(int modifiers)
    Modifier.isPrivate(int modifiers)
    Modifier.isProtected(int modifiers)
    Modifier.isPublic(int modifiers)
    Modifier.isStatic(int modifiers)
    Modifier.isStrict(int modifiers)
    Modifier.isSynchronized(int modifiers)
    Modifier.isTransient(int modifiers)
    Modifier.isVolatile(int modifiers)

    パッケージ情報
    パッケージ情報は、次の方法で入手できます.
    Class  aClass = ... //obtain Class object. See prev. section
    Package package = aClass.getPackage();

    パケット名などのパケット情報は、Packageオブジェクトから取得できます.classpathパスの下にあるjarの下にあるManifestファイルのパッケージの明確に定義されたパッケージ情報にもアクセスできます.たとえば、Manifestファイルでパッケージのバージョン番号を指定できます.Java.lang.Packageでは、より詳細なPackageオブジェクトの情報にアクセスできます.
    スーパークラスClassオブジェクトからクラスのスーパークラスにアクセスできます.コードは次のとおりです.
    Class superclass = aClass.getSuperclass();

    スーパークラスオブジェクトも通常のClassオブジェクトなので、反射操作ができます.
    実装されたインタフェース
    与えられたクラスの実装インタフェースのリストを得ることができます.コードは次のとおりです.
    Class  aClass = ... //obtain Class object. See prev. section
    Class[] interfaces = aClass.getInterfaces();

    1つのクラスは複数のインタフェースを実装することができるので、戻り値はClass配列である.反射では、インタフェースもClassオブジェクトで表される.注意:クラス表示インプリメンテーションのインタフェースのみが返されます.クラスのスーパークラスがインタフェースを実装しているが、このクラスが実装されていない場合、スーパークラス実装のインタフェースは返される配列に含まれません.このクラスが実際にそのインタフェース(スーパークラスが直接実現するインタフェース)を実現しても、それはスーパークラスが実現するからである.クラス実装の完全なインタフェースリストを取得する必要がある場合は、このクラスとそのすべてのスーパークラスを再帰する必要があります.
    コンストラクタ
    クラスのコンストラクション関数にアクセスできます.コードは次のとおりです.
    Constructor[] constructors = aClass.getConstructors();

    コンストラクション関数の詳細チュートリアルはConstructorsの章にあります.
    方法
    クラスにアクセスする方法です.コードは次のとおりです.
    Method[] method = aClass.getMethods();

    メソッドの詳細チュートリアルはMethods章にあります.
    ツールバーの
    クラスのプロパティ(メンバー変数)にアクセスできます.コードは次のとおりです.
    Field[] method = aClass.getFields();

    プロパティの詳細チュートリアルはFields章です.
    注釈
    クラスの注釈にアクセスできます.コードは次のとおりです.
    Annotation[] annotations = aClass.getAnnotations();

    注記の詳細はAnnotationsの章で説明します.