一文詳解Java中的反射api
更新時間:2025年02月05日 09:01:04 作者:會說法語的豬
這篇文章主要為大家詳細介紹了Java中的6個反射api,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以跟隨小編一起學習一下
1. 調用無參數構造器得到一個類的對象返回
public static void main(String[] args) throws Exception {
// 反射第一步先得到Class對象
Class c = Person.class;
// 定位無參構造器對象
Constructor constructor = c.getDeclaredConstructor();
// 暴力打開私有構造器的訪問權限(如果是私有構造器、private 就可以使用setAccessible暴力打開)
constructor.setAccessible(true);
// 通過無參數構造器初始化對象返回
Person person = (Person) constructor.newInstance();
System.out.println(person);
}
2. 調用有參數構造器得到一個類的對象返回
public static void main(String[] args) throws Exception {
// 反射第一步先得到Class對象
Class c = Person.class;
// 定位無參構造器對象
Constructor constructor = c.getDeclaredConstructor(String.class, Integer.class, String.class);
// 暴力打開私有構造器的訪問權限(如果是私有構造器、private 就可以使用setAccessible暴力打開)
// constructor.setAccessible(true);
// 通過無參數構造器初始化對象返回
Person person = (Person) constructor.newInstance("WFT", 18, "1.88");
System.out.println(person);
}
3. 獲取全部的成員變量
public static void main(String[] args) throws Exception {
// 反射第一步先得到Class對象
Class c = Person.class;
// 獲取全部聲明的成員變量對象
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName() + "-->>" + field.getType());
}
}
4. 獲取某個成員變量 并為其賦值
public static void main(String[] args) throws Exception {
// 反射第一步先得到Class對象
Class c = Person.class;
// 獲取全部聲明的成員變量對象
Field nameField = c.getDeclaredField("name");
System.out.println(nameField.getName() + "--->>" + nameField.getType());
Person person = new Person();
nameField.setAccessible(true); // 因為是私有屬性 采用暴力反射!
/**
* 參數1:被賦值的對象
* 參數2:該成員變量的值
*/
nameField.set(person, "王大錘");
System.out.println(person);
/**
* 獲取改成員變量的值
*/
String name = nameField.get(person) + "";
System.out.println(name);
}
5. 獲取所有的methods方法
public static void main(String[] args) {
// 反射第一步先得到Class對象
Class c = Person.class;
// 獲取所有的方法
Method[] methods = c.getDeclaredMethods();
// 遍歷看一下
for (Method method : methods) {
// 方法名稱 參數個數 返回值類型
System.out.println(method.getName() + "->" + method.getParameterCount() + "->" + method.getReturnType());
}
}
6. 獲取某個methods方法并執(zhí)行
public static void main(String[] args) throws Exception {
// 反射第一步先得到Class對象
Class c = Person.class;
// 獲取setName方法
Method setName = c.getDeclaredMethod("setName", String.class);
// 調用方法
Person person = new Person();
Object o = setName.invoke(person, "WFT"); // 如果方法沒有返回值 返回值為null
System.out.println(o);
System.out.println(person);
}到此這篇關于一文詳解Java中的反射api的文章就介紹到這了,更多相關Java反射api內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用Mybatis-plus實現對數據庫表的內部字段進行比較
這篇文章主要介紹了使用Mybatis-plus實現對數據庫表的內部字段進行比較方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
kafka啟動報錯(Cluster ID)不匹配問題以及解決
這篇文章主要介紹了kafka啟動報錯(Cluster ID)不匹配問題以及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
springboot+mongodb 實現按日期分組分頁查詢功能
這篇文章主要介紹了springboot+mongodb 實現按日期分組分頁查詢功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-07-07

