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類別:提供了動態建立數組,以及存取數組的元素的靜態方法
使用
##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中文網其他相關文章!