反射概述:
Java反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。
GetClass {
/*
* Class類就是描述class文件對象的類
*
* 獲取class文件對象的三種方式
* 1.Object類中的方法getClass Class<?> getClass() 返回此 Object
* 的運行時類。
* 2.通過類名的屬性獲取 每種數據類型(基本,引用),都會賦予該類型一個calss屬性,作用就是獲取class文件對象
* 3.Class類中的靜態方法forName static Class<?> forName(String className)
* 返回與帶有給定字符串名的類或接口相關聯的 Class 對象。
*
* 注意:class文件對象,一個類只會產生一個
*/
public static void main(String[] args) throws Exception {
// 1.Object類中的方法getClass Class<?> getClass()
Bean bean = new Bean();
Class c1 = bean.getClass();
System.out.println(c1);
// 2.通過類名的屬性獲取
Class c2 = Bean.class;
System.out.println(c2);
// 3.Class類中的靜態方法forName(使用的最多的)
Class c3 = Class.forName("com.simon.Bean");
System.out.println(c3);
}
}
GetEmptyConstructor { //快速獲取空參構造
/*
* 使用反射技術快速獲取空參構造方法的對象 使用的前提:
* 1.獲取的類中必須有空參數構造方法
* 2.空參數構造方法權限不能私有的,建議使用public,使用方便
*
* 使用Class類中的方法 T newInstance() 創建此 Class 對象所表示的類的一個新實例。
*/
public static void main(String[] args) throws Exception {
Class c1 = Class.forName("com.simon.Bean");
Object object = c1.newInstance();
System.out.println(object);
}
}
GetConstructor { //獲取構造函數
/*
* 使用反射獲取類中的構造方法
*
* 使用步驟:
* 1.獲取class文件對象
* 2.通過class文件對象中提供的方法,獲取類中的構造方法
* 3.把獲取到的構造方法初始化執行
*/
public static void main(String[] args) throws Exception {
// 1.獲取class文件對象
Class c1 = Class.forName("com.simon.Bean");
// 2.通過class文件對象中提供的方法,獲取類中的構造方法
Constructor[] constructors = c1.getDeclaredConstructors();
for (Constructor constructor : constructors) {
// 取消Java的訪問權限檢查-->暴力反射(不推薦,破壞了類的封裝性)
constructor.setAccessible(true);
}
Object object = constructors[1].newInstance("hello world", 100);
System.out.println(object);
}
}
GetMembers { //獲取成員變量
/*
* 使用反射技術獲取Bean類中的成員變量
*
* 使用步驟:
* 1.獲取class文件對象
* 2.通過class文件對象中提供的方法,獲取類中的成員變量(字段)
* 3.可以使用字段Field中的方法,設置字段的值,獲取字段的值
*/
public static void main(String[] args) throws Exception {
// 1.獲取class文件對象
Class c1 = Class.forName("com.simon.Bean");
// 獲取所有成員變量
Field[] fields = c1.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
// 獲取指定成員變量
Field fieldName = c1.getDeclaredField("name");
// 設置可訪問私有成員變量
fieldName.setAccessible(true);
// 獲取對象
Object obj = c1.newInstance();
// 賦值
fieldName.set(obj, "lily");
// 取值
Object object = fieldName.get(obj);
System.out.println(object);
}
}
GetMethods { //獲取方法
/*
* 使用反射技術獲取類中的成員方法
*
* 使用步驟:
* 1.獲取class文件對象
* 2.通過class文件對象中提供的方法,獲取類中的成員方法(Method)
* 3.可以使用字段Method中的方法,運行獲取到的方法
*/
public static void main(String[] args) throws Exception {
// 1.獲取class文件對象
Class clazz = Class.forName("com.simon.Bean");
// 2.通過class文件對象中提供的方法,獲取類中的成員方法(Method)
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
// System.out.println(method);
}
// 獲取指定的成員方法
Method getName = clazz.getDeclaredMethod("getName");
System.out.println(getName);
Method setName = clazz.getDeclaredMethod("setName", String.class);
System.out.println(setName);
// 獲取bean類對象
Object obj = clazz.newInstance();
Object setNameObj = setName.invoke(obj, "Lily");
Object getNameObj = getName.invoke(obj);
System.out.println(getNameObj);
}
}