Java Reflection(Java反射)
4471 ワード
1、反射
(1)Reflection(Reflection)はJavaが動的言語と見なす鍵であり,反射メカニズムはプログラムが実行期間中にReflection APIを用いて任意のクラスの内部情報を取得し,任意のオブジェクトの内部属性や方法を直接操作できるようにする.
(2)クラスのロードが完了すると、スタックメモリのメソッド領域にClassタイプのオブジェクト(クラスに1つのClassオブジェクトのみ)が生成され、このメソッドには完全なクラスの構造情報が含まれます.このオブジェクトからクラスの構造が表示されます.
(3)通常方式:必要な「パッケージクラス」名の導入-->newインスタンス化-->インスタンス化対象の取得
(4)反射方式:オブジェクトをインスタンス化->getClass()メソッド->完全なパッケージクラス名を取得
2、Java反射メカニズムが提供する機能
(1)実行時にいずれかのオブジェクトが属すると判断するクラス
(2)実行時に任意のクラスのオブジェクトを構築する
(3)実行時に任意のクラスが持つメンバー変数とメソッドを判断する
(4)運転時に汎用情報を取得する
(5)実行時に任意のオブジェクトを呼び出すメンバー変数とメソッド
(6)実行時にコメントを処理する
(7)動的エージェントの生成
…………
3、Java反射のメリットとデメリット
(1)利点:オブジェクトの動的作成とコンパイルを実現でき、柔軟性が高い.
(2)欠点:性能に影響を与える.反射を使用することは基本的に説明操作であり、JVMに何をしたいのか、そして私たちの要求を満たすことができるかを教えてあげることができます.このような操作は、同じ操作を直接実行するよりも常に遅い.
4、クラス
(1)すべてのサブクラスに継承されるObjectクラスに「public final Class getClass()」が定義されている.
(2)getClass()メソッドの戻り値タイプはClassクラスであり,これは反射の元であり,オブジェクト反射によりクラス名を求めることができる.
(3)JREはクラスごとに一定のClassタイプのオブジェクトを保持する.Classオブジェクトには、特定の構造(class、interface、enum、annotation、primitive type、void、[])に関する情報が含まれます.
①Class自体もクラスです.
②Classオブジェクトはシステムによってしか作成できない.
③1つのロードされたクラスはJVMの中で、1つのClassインスタンスしかありません.
④ClassオブジェクトはJVMにロードされた.classファイルに対応する.
⑤各クラスのインスタンスは、自分がどのClassインスタンスによって生成されたかを覚えています.
⑥Classによって1つのクラスのすべての別のロードされた構造を完全に得ることができる.
⑦ClassクラスはReflectionの元であり、動的にロード、実行したいクラスに対しては、まず対応するClassオブジェクトを取得する必要があります.
(4)Classクラスのインスタンスの取得
①特定のクラスが既知であれば、クラスのclass属性で取得し、この方法が最も安全で信頼性が高く、プログラム性能が最も高い.
Class clazz=クラス名.class;
②クラスのインスタンスが既知であり、そのインスタンスのgetClass()メソッドを呼び出してClassオブジェクトを取得する.
Class clazz=インスタンス.getClass()
③クラスの全クラス名が知られており、クラスパスの下でClassクラスの静的メソッドforName()で取得でき、ClassNotFoundException異常を処理する必要がある.
Class clazz=Class.forName(「パッケージ名.クラス名」)
④内蔵の基本データ型はクラス名.TYPEで直接使用できます.
Class clazz = Integer.TYPE;
5、どのタイプにClassオブジェクトがありますか.
(1)Reflection(Reflection)はJavaが動的言語と見なす鍵であり,反射メカニズムはプログラムが実行期間中にReflection APIを用いて任意のクラスの内部情報を取得し,任意のオブジェクトの内部属性や方法を直接操作できるようにする.
(2)クラスのロードが完了すると、スタックメモリのメソッド領域にClassタイプのオブジェクト(クラスに1つのClassオブジェクトのみ)が生成され、このメソッドには完全なクラスの構造情報が含まれます.このオブジェクトからクラスの構造が表示されます.
(3)通常方式:必要な「パッケージクラス」名の導入-->newインスタンス化-->インスタンス化対象の取得
(4)反射方式:オブジェクトをインスタンス化->getClass()メソッド->完全なパッケージクラス名を取得
2、Java反射メカニズムが提供する機能
(1)実行時にいずれかのオブジェクトが属すると判断するクラス
(2)実行時に任意のクラスのオブジェクトを構築する
(3)実行時に任意のクラスが持つメンバー変数とメソッドを判断する
(4)運転時に汎用情報を取得する
(5)実行時に任意のオブジェクトを呼び出すメンバー変数とメソッド
(6)実行時にコメントを処理する
(7)動的エージェントの生成
…………
3、Java反射のメリットとデメリット
(1)利点:オブジェクトの動的作成とコンパイルを実現でき、柔軟性が高い.
(2)欠点:性能に影響を与える.反射を使用することは基本的に説明操作であり、JVMに何をしたいのか、そして私たちの要求を満たすことができるかを教えてあげることができます.このような操作は、同じ操作を直接実行するよりも常に遅い.
4、クラス
(1)すべてのサブクラスに継承されるObjectクラスに「public final Class getClass()」が定義されている.
(2)getClass()メソッドの戻り値タイプはClassクラスであり,これは反射の元であり,オブジェクト反射によりクラス名を求めることができる.
(3)JREはクラスごとに一定のClassタイプのオブジェクトを保持する.Classオブジェクトには、特定の構造(class、interface、enum、annotation、primitive type、void、[])に関する情報が含まれます.
①Class自体もクラスです.
②Classオブジェクトはシステムによってしか作成できない.
③1つのロードされたクラスはJVMの中で、1つのClassインスタンスしかありません.
④ClassオブジェクトはJVMにロードされた.classファイルに対応する.
⑤各クラスのインスタンスは、自分がどのClassインスタンスによって生成されたかを覚えています.
⑥Classによって1つのクラスのすべての別のロードされた構造を完全に得ることができる.
⑦ClassクラスはReflectionの元であり、動的にロード、実行したいクラスに対しては、まず対応するClassオブジェクトを取得する必要があります.
(4)Classクラスのインスタンスの取得
①特定のクラスが既知であれば、クラスのclass属性で取得し、この方法が最も安全で信頼性が高く、プログラム性能が最も高い.
Class clazz=クラス名.class;
②クラスのインスタンスが既知であり、そのインスタンスのgetClass()メソッドを呼び出してClassオブジェクトを取得する.
Class clazz=インスタンス.getClass()
③クラスの全クラス名が知られており、クラスパスの下でClassクラスの静的メソッドforName()で取得でき、ClassNotFoundException異常を処理する必要がある.
Class clazz=Class.forName(「パッケージ名.クラス名」)
④内蔵の基本データ型はクラス名.TYPEで直接使用できます.
Class clazz = Integer.TYPE;
package cn.sxy.demo02;
public class Test02 {
public static void main(String[] args) throws ClassNotFoundException {
// :
Person student = new Student();
Class c1 = student.getClass();
System.out.println(c1);
// : forName
Class c2 = Class.forName("cn.sxy.demo02.Student");
System.out.println(c2);
// : .class
Class c3 = Student.class;
System.out.println(c3);
// : Type
Class c4 = Integer.TYPE;
System.out.println(c4);
}
}
class Person {
public String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
class Student extends Person {
public Student() {
this.name = " ";
}
}
5、どのタイプにClassオブジェクトがありますか.
package cn.sxy.demo02;
import java.lang.annotation.ElementType;
public class Test03 {
// Class
public static void main(String[] args) {
Class c1 = Class.class; // Class class java.lang.Class
Class c2 = Comparable.class; // interface java.lang.Comparable
Class c3 = String[].class; // class [Ljava.lang.String;
Class c4 = int[][].class; // class [[I
Class c5 = ElementType.class; // class java.lang.annotation.ElementType
Class c6 = Override.class; // interface java.lang.Override
Class c7 = Integer.class; // class java.lang.Integer
Class c8 = void.class; // void void
Class c9 = Object.class; // class java.lang.Object
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println(c4);
System.out.println(c5);
System.out.println(c6);
System.out.println(c7);
System.out.println(c8);
System.out.println(c9);
/**
* :
* class java.lang.Class
* interface java.lang.Comparable
* class [Ljava.lang.String;
* class [[I
* class java.lang.annotation.ElementType
* interface java.lang.Override
* class java.lang.Integer
* void
* class java.lang.Object
*/
}
}