Java語法回顧之反射
讀了那麼多年的書讓我明白一個道理。人要穩重,不要想到啥就做啥。做一行越久即使你不會,幾年之後慢慢的你也會了,加上一點努力你或許你能成爲別人眼中的專家。
反射獲取字節碼文件
/*
* 反射:在運行狀態下,通過class文件對象(Class的對象),去使用構造方法,成員變量,成員方法。
*
* 那麼,我們是如何獲取到class文件對象的呢?(字節碼文件對象)
* A:Object類的getClass()方法。
* B:數據類型的靜態的class屬性
* C:通過Class類的靜態方法forName(String className)
*
* 到底使用哪一種呢?
* 開發中用第三種。自己寫例子測試可以使用前兩種。
* 因爲第三種方式可以結合配置文件使用。
*/
反射獲取字節碼文件
/**
* 通過反射獲取字節碼文件
*/
public class MyReflect {
public static void main(String[] args) throws ClassNotFoundException {
MyPerson my = new MyPerson();
Class<? extends MyPerson> myClass = my.getClass();
MyPerson mp = new MyPerson();
Class<? extends MyPerson> aClass = mp.getClass();
System.out.println(myClass.equals(aClass));//true
Class<MyPerson> myPersonClass = MyPerson.class;
System.out.println(aClass==myPersonClass);//true
//第三種,開發時使用的方式
Class aClass1 = Class.forName("cn.itcast_01.MyPerson");
System.out.println(myPersonClass==aClass1);//true
}
}
通過反射獲取構造方法
/**
* 反射獲取構造方法並使用。
* <p/>
* 構造方法 Constructor
* 成員變量 Field
* 成員方法 Method
*/
public class MyReflect {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> aClass = Class.forName("cn.itcast_01.MyPerson");
//獲取構造器對象
// 一般我們創建對象,只要一個構造方法就可以了,所以,我們只需要獲取一個構造方法即可。
Constructor<?> constructor = aClass.getConstructor();
//帶參構造方法
Constructor<?> constructor2 = aClass.getConstructor(int.class,String.class);
//通過Constructor創建實例對象
Object o = constructor.newInstance();
Object hsia = constructor2.newInstance(23, "Hsia");
System.out.println("無參構造"+o);
System.out.println("帶參構造"+hsia);
System.out.println("*******************");
}
}
反射獲取成員變量並使用
/**
* 獲取私有成員變量並使用
*/
public class MyReflectField {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//獲取字節碼文件
Class<?> c = Class.forName("cn.itcast_01.MyPerson");
//創建對象
Constructor<?> constructor = c.getConstructor();
Object obj = constructor.newInstance();
//沒有設置值之前的obj對象
System.out.println("初始化前的值:" + obj);
//獲取共有字段名稱
Field age = c.getField("age");
//給共有字段設置值
age.set(obj, 23);
//獲取私有字段
Field name = c.getDeclaredField("name");
//暴力訪問
name.setAccessible(true);//不要限制我。
name.set(obj, "Hsia");//報錯 java.lang.IllegalAccessException:
//設置值後的對象
System.out.println("初始化後的值:" + obj);
}
}
反射獲取成員方法並使用
/**
* 獲取成員方法並使用。
*/
public class MyReflect {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//獲取字節碼文件
Class<?> c = Class.forName("cn.itcast_01.MyPerson");
//創建對象
Constructor<?> constructor = c.getConstructor();
Object obj = constructor.newInstance();
//1.獲取成員方法 無參無返回值
Method show = c.getMethod("show");
show.invoke(obj,null);
System.out.println("——————————————————");
//2.獲取成員方法 帶參無返回值
Method function = c.getMethod("function",String.class);
function.invoke(obj,"Hsia");
System.out.println("——————————————————");
//3.獲取成員方法 帶參有返回值
Method reutrnValue = c.getMethod("reutrnValue", String.class, int.class);
//return 的返回值
Object hsia = reutrnValue.invoke(obj, "Hsia", 23);
System.out.println(hsia);
System.out.println("——————————————————");
//4.獲取私有成員方法
Method helloworld = c.getDeclaredMethod("hello");
//設置暴力訪問
helloworld.setAccessible(true);
helloworld.invoke(obj,null);
}
}