想研究下web框架如spring,struts的原理,但又不知從何看起,就想先研究一下反射機制,有大牛看到的話還請指點一下,我先此致敬禮了java
所謂的反射機制就是java語言在運行時擁有一項自觀的能力,經過這種能力能夠完全的瞭解自身的狀況爲下一步的動做作準備。聽說這回顛覆對java的理解。。。web
方法總結以下:spring
Java類反射中的主要方法 對於如下三類組件中的任何一類來講 -- 構造函數、字段和方法 -- java.lang.Class 提供四種獨立的反射調用,以不一樣的方式來得到信息。數組
調用都遵循一種標準格式。如下是用於查找構造函數的一組反射調用: 框架
Constructor getConstructor(Class[] params) -- 得到使用特殊的參數類型的公共構造函數, Constructor[] getConstructors() -- 得到類的全部公共構造函數ide
Constructor getDeclaredConstructor(Class[] params) -- 得到使用特定參數類型的構造函數(與接入級別無關) 函數
Constructor[] getDeclaredConstructors() -- 得到類的全部構造函數(與接入級別無關)ui
得到字段信息的Class 反射調用不一樣於那些用於接入構造函數的調用,在參數類型數組中使用了字段名: this
Field getField(String name) -- 得到命名的公共字段 spa
Field[] getFields() -- 得到類的全部公共字段
Field getDeclaredField(String name) -- 得到類聲明的命名的字段
Field[] getDeclaredFields() -- 得到類聲明的全部字段
用於得到方法信息函數:
Method getMethod(String name, Class[] params) -- 使用特定的參數類型,得到命名的公共方法
Method[] getMethods() -- 得到類的全部公共方法
Method getDeclaredMethod(String name, Class[] params) -- 使用特寫的參數類型,得到類聲明的命名的方法
Method[] getDeclaredMethods() -- 得到類聲明的全部方法
開始實例:
假設咱們有一個類:
package yui; public class Role { private String name; private String type; // Constructors public Role(){ System.out.println("Constructor Role() is invoking"); } //私有構造器 private Role(String name){ this.name = name; System.out.println("Constructor Role(String name) is invoking."); } //get and set method public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } //override the toString method to show the class @Override public String toString(){ return "This is a role called "+this.name; } }
在沒有對象實例的時候,主要有兩種辦法。
Class cls1 = Role.class;
Class cls2 = Class.forName("yui.Role");//(yui是包名,Role是類名)
獲取類的構造器:
Object o=cls1.newInstance();//建立一個實例//Object o1=new Role();//與上面的方法等價可是直接動過class得到的建立的實例的時候咱們只能使用默認構造函數,由於Class的newInstance是不接受參數的,且若是類的構造函數是private的,好比Class(的確,class中的構造函數是private的),咱們仍舊不能實例化其對象。而用Constructor類用來封裝反射獲得的構造器,就能夠調用私有構造器了。
獲取類的構造器(感受仍是從下面的代碼才理解了反射機制的做用):
/** * 獲取構造方法Constructor * getConstructor() only for public * getDeclaredConstructor() global access all * * */ //指定參數列表獲取特定的方法 Constructor con = cls1.getDeclaredConstructor(new Class[]{String.class}); con.setAccessible(true); //設置可訪問的權限 Object obj = con.newInstance(new Object[]{"liyang"}); System.out.println(obj); //打印一下這個對象的信息 //獲取全部的構造方法集合 Constructor con1[] = cls1.getDeclaredConstructors(); con1[1].setAccessible(true); Object obj1 = con1[1].newInstance(new Object[]{"tom"}); System.out.println(obj1);
獲取類的成員變量:
/** * 獲取成員變量Field * getField() * getDeclaredField() * */ Field mem = cls1.getDeclaredField("name"); mem.setAccessible(true); System.out.println("we get form field :"+mem.get(obj));
獲取類的方法:
/** * 調用類的方法 Method * getMethod() * getDeclaredMethod() * * */ Method f = cls1.getMethod("getName", null); Object name = f.invoke(obj, null); System.out.println("we invoke method : "+ name);