ホームページ  >  記事  >  Java  >  Java とはどのような反射ですか?

Java とはどのような反射ですか?

青灯夜游
青灯夜游オリジナル
2019-11-18 14:14:022515ブラウズ

Java とはどのような反射ですか?

#Java とはどのようなリフレクションですか?

リフレクションとはJavaの機能の1つで、対象のオブジェクトを間接的に操作するための仕組みです。

JAVA リフレクション メカニズムでは、実行状態では、任意のエンティティ クラスについて、このクラスのすべてのプロパティとメソッドを知ることができ、任意のオブジェクトについて、その任意のメソッドおよびプロパティを呼び出すことができます。この種の動的 情報を取得し、オブジェクトのメソッドを動的に呼び出す機能を Java 言語のリフレクション機構といいます。

Java でリフレクションが必要なのはなぜですか?リフレクションはどのような問題を解決しますか?

一言で言えば、リフレクションにより jvm に動的コンパイル機能が与えられます。それ以外の場合、クラスのメタデータ情報はホット ロードなどの静的コンパイルによってのみ取得できます。 Tomcat のクラスローダーなどはサポートできません。

#Java には 2 つのタイプのコンパイルがあります。

#● 静的コンパイル: タイプはコンパイル時に決定され、バインドされたオブジェクトが渡されます。

# 動的コンパイル: 型を決定し、実行時にオブジェクトをバインドします。動的コンパイルは Java の柔軟性を最大限に高め、ポ​​リモーフィックなアプリケーションを具体化し、クラス間の結合を減らすことができます。

Java リフレクションは、動的 (または準動的) 言語とみなされている Java の重要なプロパティです。このメカニズムにより、プログラムは、実行時にリフレクション API を介して、その修飾子 (public、static など)、スーパークラス (Object など)、実装されたインターフェイス (オブジェクトなど) を含む、既知の名前を持つ任意のクラスの内部情報を取得できます。クローン可能)、フィールドとメソッドに関するすべての情報。フィールドの内容を変更したり、実行時にメソッドを呼び出したりできます。

Reflection は、実行時のコンパイル中にまったく不明なクラスをロード、検出、使用できます。つまり、Java プログラムは、名前が実行時にのみ判明するクラスをロードし、その完全な構造を取得して、そのオブジェクト エンティティを生成したり、そのフィールドに値を設定したり、そのメソッドを呼び出したりすることができます。

リフレクションを使用すると、静的言語で実行時にプログラムの構造と動作を検査および変更できます。

静的言語では、変数を使用するとき、その型を知っている必要があります。 Java では、変数の型情報はコンパイル時にクラス ファイルに保存されるため、実行時に正確になる、つまり、実行時のプログラムの動作が固定されます。実行時に変更したい場合は、リフレクションが必要です。

Java リフレクション メカニズムを実装するクラスはすべて、java.lang.reflect パッケージにあります:

1. クラス クラス: クラス

2. フィールド クラスを表します。 : クラスを表す メンバー変数 (クラスのプロパティ)

3. メソッド クラス: クラス

4 のメソッドを表す コンストラクター クラス: クラス

の構築メソッドを表す

5. 配列クラス: 配列を動的に作成し、配列要素の静的メソッドにアクセスするための機能を提供します。

Use

Java とはどのような反射ですか?

#1. クラス オブジェクトを取得する 3 つの方法

1.1 オブジェクト ——> getClass();

1.2 任意のデータ型(基本的なデータ型を含む) 「静的」クラス属性があります。
1.3 Class クラスの静的メソッドを通じて: forName (String className) (一般的に使用されます)

/**
 * 获取Class对象的三种方式
 * 1 Object ——> getClass();
 * 2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
 * 3 通过Class类的静态方法:forName(String  className)(常用)
 *
 */
public class Fanshe {
	public static void main(String[] args) {
		//第一种方式获取Class对象  
		Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。
		Class stuClass = stu1.getClass();//获取Class对象
		System.out.println(stuClass.getName());
		
		//第二种方式获取Class对象
		Class stuClass2 = Student.class;
		System.out.println(stuClass == stuClass2);
//判断第一种方式获取的Class对象和第二种方式获取的是否是同一个
		
		//第三种方式获取Class对象
		try {
			Class stuClass3 = Class.forName("fanshe.Student");
//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
			System.out.println(stuClass3 == stuClass2);
//判断三种方式是否获取的是同一个Class对象
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
 
		System.out.println("*****************获取公有、无参的构造方法*************");
		Constructor con = clazz.getConstructor(null);
		//1>、因为是无参的构造方法所以类型是一个null,不写也可以:这里需要的是一个参数的类型,切记是类型
		//2>、返回的是描述这个无参构造函数的类对象。
 
 
		System.out.println("*************获取公有字段**并调用*****************");
		Field f = stuClass.getField("name");
        System.out.println(f);
		
 
		System.out.println("***************获取私有的show4()方法******************");
		m = stuClass.getDeclaredMethod("show4", int.class);
		System.out.println(m);
		m.setAccessible(true);//解除私有限定
		Object result = m.invoke(obj, 20);//需要两个参数,一个是要调用的对象(获取有反射),一个是实参
		System.out.println("返回值:" + result);
 
	}
}

以上がJava とはどのような反射ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。