一文詳解Java中的反射api
1. 調(diào)用無(wú)參數(shù)構(gòu)造器得到一個(gè)類的對(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è)類的對(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) {
// 方法名稱 參數(shù)個(gè)數(shù) 返回值類型
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)文章
Springboot分模塊項(xiàng)目搭建的實(shí)現(xiàn)
在軟件開(kāi)發(fā)中,利用Spring?Boot進(jìn)行分模塊項(xiàng)目搭建能夠提高代碼的模塊化和復(fù)用性,本文主要介紹了Springboot分模塊項(xiàng)目搭建的實(shí)現(xiàn),感興趣的可以了解一下2024-10-10
使用Mybatis-plus實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表的內(nèi)部字段進(jìn)行比較
這篇文章主要介紹了使用Mybatis-plus實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表的內(nèi)部字段進(jìn)行比較方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
kafka啟動(dòng)報(bào)錯(cuò)(Cluster ID)不匹配問(wèn)題以及解決
這篇文章主要介紹了kafka啟動(dòng)報(bào)錯(cuò)(Cluster ID)不匹配問(wèn)題以及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
詳解Spring AOP 攔截器的基本實(shí)現(xiàn)
本篇文章主要介紹了詳解Spring AOP 攔截器的基本實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
jdbc實(shí)現(xiàn)用戶注冊(cè)功能代碼示例
這篇文章主要介紹了jdbc實(shí)現(xiàn)用戶注冊(cè)功能,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
springboot+mongodb 實(shí)現(xiàn)按日期分組分頁(yè)查詢功能
這篇文章主要介紹了springboot+mongodb 實(shí)現(xiàn)按日期分組分頁(yè)查詢功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07

