1. 程式人生 > 實用技巧 >Java反射機制 之 獲取類的 方法 和 屬性(包括建構函式)(Day_06)

Java反射機制 之 獲取類的 方法 和 屬性(包括建構函式)(Day_06)

把自己立成帆,才能招來鳳。


  • 執行環境

   JDK8 +IntelliJ IDEA 2018.3

  • 本文中使用的jar包連結

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

  • 獲取建構函式(方法)

需要獲取類的結構

 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()這四個方法獲取各種欄位

 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 }

結論:

getFields()返回所有public的欄位。

getDeclaredFields()返回所有privatepublic欄位

getField()返回指定欄位名public的欄位。

getDeclaredField()返回指定欄位名的privatepublic欄位名

  • 獲取類中的方法
 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("預設修飾"+name+" "+sex+" "+age);
11         return name+" "+sex+" "+age;
12     }
13 
14     protected void method4(){
15         System.out.println("protected 修飾的方法");
16     }

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

 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物件
 8         //會報出不存在該類的異常
 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 }

結論:

  • getMethods()返回所有public的方法,通過結果可以看出getMethods()連父類中的public方法也可以獲取到
  • getDeclaredMethods()返回所有privatepublic方法名,getDeclaredMethods()獲取不到父類中的方法,只能獲取到本來中的方法
  • getMethod()返回指定欄位名public的方法名。
  • getDeclaredMethod()返回指定字方法名的privatepublic欄位名
  • getConstructors()不能獲取到父類的構造方法,getDeclaredConstructors()也只能獲取到本類中的構造方法


      • ps:

如果,您希望更容易地發現我的新部落格,不妨點選一下關注。

如果你覺得本篇文章對你有所幫助,請給予我更多的鼓勵,

因為,我的寫作熱情也離不開您的肯定支援,感謝您的閱讀,我是【肥肥也】!