Java反射機(jī)制 之 獲取類的 方法 和 屬性(包括構(gòu)造函數(shù))

把自己立成帆打洼,才能招來鳳夭委。

運(yùn)行環(huán)境

JDK8 + IntelliJ IDEA 2018.3

本文中使用的jar包鏈接

https://files.cnblogs.com/files/papercy/jsoup_jar%E5%8C%85.rar

獲取構(gòu)造函數(shù)(方法)
需要獲取類的結(jié)構(gòu)

1 package com.wenhaitao.Demo2;
2
3 public class Student {
4 private String name;
5 private int age;
6 private String sex;
7
8 public Student() {
9 }
10
11 public Student(String name, int age, String sex) {
12 this.name = name;
13 this.age = age;
14 this.sex = sex;
15 }
16
17 public String getName() {
18 return name;
19 }
20
21 public void setName(String name) {
22 this.name = name;
23 }
24
25 public int getAge() {
26 return age;
27 }
28
29 public void setAge(int age) {
30 this.age = age;
31 }
32
33 public String getSex() {
34 return sex;
35 }
36
37 public void setSex(String sex) {
38 this.sex = sex;
39 }
40
41 @Override
42 public String toString() {
43 return "Student{" +
44 "name='" + name + ''' +
45 ", age=" + age +
46 ", sex='" + sex + ''' +
47 '}';
48 }
49 }

通過 getFields() getDeclaredFields() getField() getDeclaredField()這四個(gè)方法獲取各種字段

1 package com.wenhaitao.Demo2;
2
3 import java.lang.reflect.Constructor;
4 import java.lang.reflect.Field;
5 import java.lang.reflect.Method;
6 import java.util.Arrays;
7
8 public class Demo1 {
9 public static void main(String[] args) {
10 Student student = new Student();
11 Class clzstu = student.getClass();
12 Field[] fields= clzstu.getDeclaredFields();
13 System.out.println(Arrays.toString(fields));
14
15 try {
16 Field field = clzstu.getDeclaredField("name");
17 System.out.println("field:"+field);
18 } catch (NoSuchFieldException e) {
19 e.printStackTrace();
20 }
21 Field[] fields1 =clzstu.getDeclaredFields();
22 System.out.println("fields1:"+fields1);
23 System.out.println(Arrays.toString(fields1));
24
25 // Method
26 try {
27 Method method =clzstu.getMethod("test",String.class);
28 System.out.println("*****************");
29 System.out.println("method:"+method);
30 Method[] methods = clzstu.getMethods();
31 System.out.println("methods:"+methods);
32 System.out.println("****************");
33 System.out.println(Arrays.toString(methods));
34 System.out.println("*****************");
35 Method[] methods1=clzstu.getDeclaredMethods();
36 System.out.println("methods1:"+Arrays.toString(methods1));
37
38
39 } catch (NoSuchMethodException e) {
40 e.printStackTrace();
41 }
42 // modifiler
43 int num = clzstu.getModifiers();
44 System.out.println("num:"+num);
45
46 // constructor
47 try {
48 Constructor constructor =clzstu.getConstructor(String.class);
49 System.out.println("constructor:"+constructor);
50 } catch (NoSuchMethodException e) {
51 e.printStackTrace();
52 }
53 // constructors
54 Constructor[] constructors = clzstu.getConstructors();
55 System.out.println("constructor:"+constructors);
56 System.out.println("*****************");
57 System.out.println(Arrays.toString(constructors));
58
59 //
60
61 }
62
63 }

結(jié)論:

getFields()返回所有public的字段暴氏。

getDeclaredFields()返回所有private和public字段是复。

getField()返回指定字段名public的字段丙笋。

getDeclaredField()返回指定字段名的private和public字段名鱼蝉。

獲取類中的方法
1 public void method1(String str){
2 System.out.println("public 修飾的方法");
3 }
4
5 private void method2(){
6 System.out.println("private 修飾的方法");
7 }
8
9 String method3(String name,Integer sex,Date age){
10 System.out.println("默認(rèn)修飾"+name+" "+sex+" "+age);
11 return name+" "+sex+" "+age;
12 }
13
14 protected void method4(){
15 System.out.println("protected 修飾的方法");
16 }

通過 getMethods() getDeclaredMethods() getMethod() getDeclaredMethod()這四個(gè)方法獲取各種方法

1 import java.lang.reflect.Method;
2 import java.util.Date;
3
4 public class Test06 {
5 public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
6
7 //加載Class對(duì)象
8 //會(huì)報(bào)出不存在該類的異常
9 Class c=Class.forName("com.reflection.model.Student");
10
11 //獲取所有公共方法
12 System.out.println("================獲取所有公共方法=================");
13 Method[] methods=c.getMethods();
14 for (Method method:methods) {
15 System.out.println("公共方法:"+method);
16 }
17 //獲取所有方法
18 System.out.println("================獲取所有的方法=================");
19 Method[] declaredMethods=c.getDeclaredMethods();
20 for (Method declaredmethod:declaredMethods) {
21 System.out.println("所有方法:"+declaredmethod);
22 }
23
24 System.out.println("================獲取特定(帶參)方法=================");
25 Method method1=c.getMethod("method1",String.class);
26 System.out.println("特定(帶參)方法:"+method1);
27
28 System.out.println("================獲取特定(不帶參)方法=================");
29 Method method2=c.getDeclaredMethod("method2");
30 System.out.println("特定(不帶參)方法:"+method2);
31
32 System.out.println("================獲取特定(多參)方法=================");
33 Method method3=c.getDeclaredMethod("method3", String.class, Integer.class, Date.class);
34 System.out.println("特定(多參)方法:"+method3);
35 }
36 }

結(jié)論:

getMethods()返回所有public的方法著恩,通過結(jié)果可以看出getMethods()連父類中的public方法也可以獲取到院尔。
getDeclaredMethods()返回所有private和public方法名,getDeclaredMethods()獲取不到父類中的方法喉誊,只能獲取到本來中的方法邀摆。
getMethod()返回指定字段名public的方法名。
getDeclaredMethod()返回指定字方法名的private和public字段名伍茄。
getConstructors()不能獲取到父類的構(gòu)造方法栋盹,getDeclaredConstructors()也只能獲取到本類中的構(gòu)造方法

ps:
如果,您希望更容易地發(fā)現(xiàn)我的新博客敷矫,不妨點(diǎn)擊一下關(guān)注例获。
如果你覺得本篇文章對(duì)你有所幫助,請(qǐng)給予我更多的鼓勵(lì)曹仗,
因?yàn)檎ヌ溃业膶懽鳠崆橐搽x不開您的肯定支持,感謝您的閱讀怎茫,我是【肥肥也】收壕!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妓灌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蜜宪,更是在濱河造成了極大的恐慌虫埂,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圃验,死亡現(xiàn)場(chǎng)離奇詭異掉伏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)损谦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門岖免,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人照捡,你說我怎么就攤上這事颅湘。” “怎么了栗精?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵闯参,是天一觀的道長。 經(jīng)常有香客問我悲立,道長鹿寨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任薪夕,我火速辦了婚禮脚草,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘原献。我一直安慰自己馏慨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布姑隅。 她就那樣靜靜地躺著写隶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讲仰。 梳的紋絲不亂的頭發(fā)上慕趴,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音鄙陡,去河邊找鬼冕房。 笑死,一個(gè)胖子當(dāng)著我的面吹牛趁矾,可吹牛的內(nèi)容都是我干的毒费。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼愈魏,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼觅玻!你這毒婦竟也來了想际?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤溪厘,失蹤者是張志新(化名)和其女友劉穎胡本,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畸悬,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侧甫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蹋宦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片披粟。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冷冗,靈堂內(nèi)的尸體忽然破棺而出守屉,到底是詐尸還是另有隱情,我是刑警寧澤蒿辙,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布拇泛,位于F島的核電站,受9級(jí)特大地震影響思灌,放射性物質(zhì)發(fā)生泄漏俺叭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一泰偿、第九天 我趴在偏房一處隱蔽的房頂上張望熄守。 院中可真熱鬧,春花似錦耗跛、人聲如沸裕照。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牍氛。三九已至晨继,卻和暖如春烟阐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背紊扬。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工蜒茄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人餐屎。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓檀葛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腹缩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屿聋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 什么是java反射: JAVA反射機(jī)制是在運(yùn)行狀態(tài)中空扎,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法润讥;對(duì)于任意一...
    樂百事52淑熙閱讀 334評(píng)論 0 0
  • java的反射機(jī)制原理 一反射機(jī)制的概念:指在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法,對(duì)于任...
    Stefan02閱讀 259評(píng)論 0 0
  • 深入理解Class對(duì)象 RRTI的概念以及Class對(duì)象作用 認(rèn)識(shí)Class對(duì)象之前转锈,先來了解一個(gè)概念,RTTI(...
    架構(gòu)師springboot閱讀 1,557評(píng)論 0 3
  • 類的加載 當(dāng)程序要使用某個(gè)類時(shí)楚殿,如果該類還未被加載到內(nèi)存中撮慨,則系統(tǒng)會(huì)通過加載,連接脆粥,初始化三步來實(shí)現(xiàn)對(duì)這個(gè)類進(jìn)行初...
    HUIYL1閱讀 176評(píng)論 0 0
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月砌溺,有人笑有人哭,有人歡樂有人憂愁变隔,有人驚喜有人失落规伐,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,528評(píng)論 28 53