一文詳解Java中的反射api
1. 調(diào)用無(wú)參數(shù)構(gòu)造器得到一個(gè)類(lèi)的對(duì)象返回
public static void main(String[] args) throws Exception {
// 反射第一步先得到Class對(duì)象
Class c = Person.class;
// 定位無(wú)參構(gòu)造器對(duì)象
Constructor constructor = c.getDeclaredConstructor();
// 暴力打開(kāi)私有構(gòu)造器的訪問(wèn)權(quán)限(如果是私有構(gòu)造器、private 就可以使用setAccessible暴力打開(kāi))
constructor.setAccessible(true);
// 通過(guò)無(wú)參數(shù)構(gòu)造器初始化對(duì)象返回
Person person = (Person) constructor.newInstance();
System.out.println(person);
}
2. 調(diào)用有參數(shù)構(gòu)造器得到一個(gè)類(lèi)的對(duì)象返回
public static void main(String[] args) throws Exception {
// 反射第一步先得到Class對(duì)象
Class c = Person.class;
// 定位無(wú)參構(gòu)造器對(duì)象
Constructor constructor = c.getDeclaredConstructor(String.class, Integer.class, String.class);
// 暴力打開(kāi)私有構(gòu)造器的訪問(wèn)權(quán)限(如果是私有構(gòu)造器、private 就可以使用setAccessible暴力打開(kāi))
// constructor.setAccessible(true);
// 通過(guò)無(wú)參數(shù)構(gòu)造器初始化對(duì)象返回
Person person = (Person) constructor.newInstance("WFT", 18, "1.88");
System.out.println(person);
}
3. 獲取全部的成員變量
public static void main(String[] args) throws Exception {
// 反射第一步先得到Class對(duì)象
Class c = Person.class;
// 獲取全部聲明的成員變量對(duì)象
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName() + "-->>" + field.getType());
}
}
4. 獲取某個(gè)成員變量 并為其賦值
public static void main(String[] args) throws Exception {
// 反射第一步先得到Class對(duì)象
Class c = Person.class;
// 獲取全部聲明的成員變量對(duì)象
Field nameField = c.getDeclaredField("name");
System.out.println(nameField.getName() + "--->>" + nameField.getType());
Person person = new Person();
nameField.setAccessible(true); // 因?yàn)槭撬接袑傩?采用暴力反射!
/**
* 參數(shù)1:被賦值的對(duì)象
* 參數(shù)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對(duì)象
Class c = Person.class;
// 獲取所有的方法
Method[] methods = c.getDeclaredMethods();
// 遍歷看一下
for (Method method : methods) {
// 方法名稱(chēng) 參數(shù)個(gè)數(shù) 返回值類(lèi)型
System.out.println(method.getName() + "->" + method.getParameterCount() + "->" + method.getReturnType());
}
}
6. 獲取某個(gè)methods方法并執(zhí)行
public static void main(String[] args) throws Exception {
// 反射第一步先得到Class對(duì)象
Class c = Person.class;
// 獲取setName方法
Method setName = c.getDeclaredMethod("setName", String.class);
// 調(diào)用方法
Person person = new Person();
Object o = setName.invoke(person, "WFT"); // 如果方法沒(méi)有返回值 返回值為null
System.out.println(o);
System.out.println(person);
}到此這篇關(guān)于一文詳解Java中的反射api的文章就介紹到這了,更多相關(guān)Java反射api內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java UUID 五個(gè)版本的區(qū)別及使用場(chǎng)景小結(jié)
在Java中,UUID是一個(gè)128位的唯一標(biāo)識(shí)符,廣泛應(yīng)用于生成唯一標(biāo)識(shí)符、分布式系統(tǒng)唯一鍵等場(chǎng)景,Java提供的java.util.UUID類(lèi)支持五種UUID版本,每種具有不同的生成方式和使用場(chǎng)景,本文就來(lái)介紹一下如何使用,感興趣的可以了解一下2024-11-11
System.currentTimeMillis()計(jì)算方式與時(shí)間的單位轉(zhuǎn)換詳解
這篇文章主要介紹了System.currentTimeMillis()計(jì)算方式與時(shí)間的單位轉(zhuǎn)換詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
Java使用Jsoup實(shí)現(xiàn)將瀏覽器書(shū)簽HTML轉(zhuǎn)換為JSON
這篇文章主要介紹了如何使用Jsoup和Fastjson2將瀏覽器導(dǎo)出的書(shū)簽HTML文件解析為層級(jí)化的JSON結(jié)構(gòu),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以了解下2026-01-01
MyBatis一級(jí)緩存與二級(jí)緩存原理與作用分析
mybatis-plus是一個(gè)Mybatis的增強(qiáng)工具,在Mybatis的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生,這篇文章帶你了解Mybatis的一級(jí)和二級(jí)緩存2022-12-12
一文帶你看懂Android動(dòng)畫(huà)的實(shí)現(xiàn)原理
動(dòng)畫(huà)是 Android 應(yīng)用程序中重要的交互特性,ndroid 提供了多種動(dòng)畫(huà)效果,包括平移、縮放、旋轉(zhuǎn)和透明度等,它們可以通過(guò)代碼或 XML 來(lái)實(shí)現(xiàn),本文將介紹 Android 動(dòng)畫(huà)的原理和實(shí)現(xiàn)方法,并提供一些示例,需要的朋友可以參考下2023-07-07
解決SpringSecurity 一直登錄失敗的問(wèn)題
這篇文章主要介紹了解決SpringSecurity 一直登錄失敗的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

