首頁 >Java >java教程 >java什麼反射?

java什麼反射?

青灯夜游
青灯夜游原創
2019-11-18 14:14:022539瀏覽

java什麼反射?

java什麼反射?

反射是Java的特徵之一,是間接操作目標物件的機制。

JAVA反射機制是在運行狀態中,對於任意一個實體類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取資訊以及動態呼叫物件方法的功能稱為java語言的反射機制。

Java中為什麼需要反射?反射要解決什麼問題?

一句話概括就是使用反射可以賦予jvm動態編譯的能力,否則類別的元資料資訊只能用靜態編譯的方式實現,例如熱加載,Tomcat的classloader等等都沒法支援

Java中編譯類型有兩種:

 ● 靜態編譯:在編譯時確定類型,綁定物件即通過。

 ● 動態編譯:執行時間決定類型,綁定物件。動態編譯最大限度地發揮了Java的靈活性,體現了多態的應用,可以降低類別之間的耦合性。

Java反射是Java被視為動態(或準動態)語言的關鍵性質。這個機制允許程式在運行時透過Reflection APIs取得任何一個已知名稱的class的內部信息,包括其modifiers(諸如public、static等)、superclass(例如Object)、實作之interfaces(例如Cloneable),也包括fields和methods的所有訊息,並可於運行時改變fields內容或喚起methods。

Reflection可以在執行時期載入、探知、使用編譯期間完全未知的classes。即Java程式可以載入一個執行時才得知名稱的class,取得其完整構造,並產生其物件實體、或對其fields設值、或喚起其methods。

反射(reflection)允許靜態語言在執行時間(runtime)檢查、修改程式的結構與行為。
在靜態語言中,使用一個變數時,必須知道它的型別。在Java中,變數的類型資訊在編譯時都保存到了class檔案中,這樣在執行時才能保證準確無誤;換句話說,程式在執行時的行為都是固定的。如果想在運作時改變,就需要反射這東西了。

實作Java反射機制的類別都位於java.lang.reflect套件中:

1、Class類別:代表一個類別

2、Field類別:代表類別的成員變數(類別的屬性)

3、Method類別:代表類別的方法

4、Constructor類別:代表類別的建構方法

5、Array類別:提供了動態建立數組,以及存取數組的元素的靜態方法

使用

java什麼反射?

##1、取得Class物件的三種方式

1.1 Object ——> getClass();

1.2 任何資料型別(包含基本資料型別)都有一個「靜態」的class屬性
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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn