標籤:注入 instance 進位 javaee win declared 準備 運行 字串
反射定義簡單表述:
對於任意一個(動態)運行中的類,我們都可以解剖它,擷取類中的構造方法,成員變數,成員方法.
類的載入
(1)載入
就是指將class檔案讀入記憶體,並為之建立一個Class對象。
任何類被使用時系統都會建立一個Class對象
(2)串連
驗證是否有正確的內部結構,並和其他類協調一致
準備負責為類的靜態成員分配記憶體,並設定預設初始化值
解析將類的位元據中的符號引用替換為直接引用
(3)初始化
1. 建立類的執行個體
2. 類的靜態變數,或者為靜態變數賦值
3. 類的靜態方法
4.使用反射方式來強制建立某個類或介面對應的java.lang.Class對象(不會載入靜態代碼塊)
5. 初始化某個類的子類
6. 直接使用java.exe命令來運行某個主類
如何擷取.Class檔案對象
1, 通過Object類 getClass()方法擷取 Class對象
2, 通過類名.class 方式 擷取 Class對象
3, 通過反射的方式,
Class.forName(String classname) 擷取Class對象
public static Class<?> forName(String className)throws ClassNotFoundException返回與帶有給定字串名的類或介面相關聯的 Class 對象
通過反射, 擷取類中的構造方法,並完成對象的建立
擷取指定的構造方法
public Constructor<T> getConstructor(Class<?>... parameterTypes)
擷取指定的public修飾的構造方法
Public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
擷取指定的構造方法,包含私人的
擷取所有的構造方法
public Constructor<?>[] getConstructors() 擷取所有的public 修飾的構造方法
public Constructor<?>[] getDeclaredConstructors() 擷取所有的構造方法,包含私人的
通過反射, 擷取類中的構造方法,並完成對象的建立
步驟:
1,擷取位元組碼檔案對象
2,通過位元組碼檔案對象 ,擷取到指定的構造方法getConstructor(參數);
3,通過構造方法,建立對象
public T newInstance(Object... initargs)
私人構造方法,建立對象
1,擷取位元組碼檔案對象
2,通過位元組碼檔案對象 ,擷取到指定的構造方法getDeclaredConstructor (參數);
3,暴力訪問 con.setAccessible(true);
4,通過構造方法,建立對象
public T newInstance(Object... initargs)
通過反射,擷取Class檔案中的方法
擷取指定的方法
public Method getMethod(String name, Class<?>... parameterTypes)
擷取指定的public方法
public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
擷取指定的任意方法,包含私人的
擷取所有的方法
public Method[] getMethods() 擷取本類與父類中所有public 修飾的方法
ublic Method[] getDeclaredMethods()擷取本類中所有的方法,包含私人的
通過反射,調用方法
步驟:
1,擷取Class對象
2,擷取構造方法,建立對象
3,擷取指定的public方法
4,執行方法
public Object invoke(Object obj, Object... args)
私人方法的調用:
1,擷取Class對象
2,擷取構造方法,建立對象
3,擷取指定的private方法
4,開啟暴力訪問
m5.setAccessible(true);(m5:擷取的方法名)
5,執行方法
public Object invoke(Object obj, Object... args)
通過反射,擷取成員變數(欄位)
擷取指定的成員變數
public Field getField(String name) 擷取public修飾的成員變數
public Field getDeclaredField(String name) 擷取任意的成員變數,包含私人
擷取所有的成員變數
public Field[] getFields() 擷取所有public修飾的成員變數
public Field[] getDeclaredFields() 擷取司所有的成員變數,包含私人
l 通過反射,擷取成員 變數,並賦值使用
步驟:
1,擷取位元組碼檔案對象
2,擷取構造方法,建立對象
3,擷取指定的成員變數
4,對成員變數賦值\擷取值操作
public void set(Object obj, Object value) 賦值
public Object get(Object obj) 擷取值
/*反射的綜合案例:
* 通過反射技術,擷取JavaBean的對象,給JavaBean的成員變數注入(賦)值*/
public class UseReflectSetFileldValue {
public static void main(String[] args) throws Exception {
Properties pro =new Properties();
pro.load(new FileReader("data.properties"));
//4.使用反射技術建立JavaBean對象
Class<?> clazz = Class.forName("cn.itcast.demo02.javabean.User");
Object obj = clazz.newInstance();
Set<String> names = pro.stringPropertyNames();
for (String s : names) {
//拼接set方法
String methodName="set"+s.substring(0, 1).toUpperCase()+s.substring(1);
//7.使用反射技術擷取setXXX方法
Method setMethod = clazz.getMethod(methodName, String.class);
setMethod.invoke(obj, pro.getProperty(s));
/*
* 擴充:拼接getXXX方法
*/
String getMethodName="get"+s.substring(0, 1).toUpperCase()+s.substring(1);
Method getMethod = clazz.getMethod(getMethodName);
System.out.println(getMethod.invoke(obj));
}
System.out.println(obj);
}
public class User implements Serializable{
/**
* 添加序號
*/
private static final long serialVersionUID = 8252072893140834728L;
private String id;
private String username;
private String password;
public User() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
JavaEE之反射