JAva反射-クラス
反射を使用すると、実行時にJavaクラスをチェックできます.検視クラスは通常、反射を使用するときに最初に行われることです.クラスから次の情報が得られます.クラス名 クラス修飾子(private、public、synchronizedなど) パッケージ情報 スーパークラス 実装インタフェース コンストラクタ メソッド 属性 注記 Javaクラスには多くの情報が添付されており、JavaDoc for java.lang.Classで完全なリストを得ることができます.ここでは、上述したすべての情報に簡単にアクセスします.一部のトピックでは、章ごとにより詳細なチェックが行われます.たとえば、すべてのメソッドまたは特定のメソッドを取得する方法について説明しますが、そのメソッドを呼び出す方法、名前が同じメソッドで特定のパラメータのセットを一致させる方法、呼び出しメソッドを反射することによってどのような異常を投げ出すか、get/setを発見する方法など、章ごとに説明します.本文の主な目的は
クラスを検査する前に、検査されたクラスの
クラスのコンパイル時の名前を知らないが、クラスの実行時の名前文字列を知っている場合は、次のコードを参照してください.
クラス名
応募を含まないクラス名を取得する必要がある場合は、
修飾子
修飾子はintにパッケージされ、各修飾子は設定またはクリアをマークする識別ビットである.
パッケージ情報
パッケージ情報は、次の方法で入手できます.
パケット名などのパケット情報は、
スーパークラス
スーパークラスオブジェクトも通常の
実装されたインタフェース
与えられたクラスの実装インタフェースのリストを得ることができます.コードは次のとおりです.
1つのクラスは複数のインタフェースを実装することができるので、戻り値は
コンストラクタ
クラスのコンストラクション関数にアクセスできます.コードは次のとおりです.
コンストラクション関数の詳細チュートリアルはConstructorsの章にあります.
方法
クラスにアクセスする方法です.コードは次のとおりです.
メソッドの詳細チュートリアルはMethods章にあります.
ツールバーの
クラスのプロパティ(メンバー変数)にアクセスできます.コードは次のとおりです.
プロパティの詳細チュートリアルはFields章です.
注釈
クラスの注釈にアクセスできます.コードは次のとおりです.
注記の詳細はAnnotationsの章で説明します.
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
オブジェクトを使用して、クラスの修飾子にアクセスできます.クラス修飾子キーワードはpublic
、private
、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の章で説明します.