Java反射機制 之 獲取類的 方法 和 屬性(包括建構函式)(Day_06)
阿新 • • 發佈:2020-08-24
把自己立成帆,才能招來鳳。
-
執行環境
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()返回所有
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("預設修飾"+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
方法也可以獲取到getDeclared
Method
s()返回所有private
和public方法名,
。getDeclared
Method
s()獲取不到父類中的方法,只能獲取到本來中的方法
get
返回指定欄位名Method
()public
的方法名。getDeclared
返回指定字方法名的Method
()private
和public欄位名
。
獲取到父類的構造方法,getConstructors()不能
getDeclaredConstructors()也
只能獲取到本類中的
構造方法
-
-
-
ps:
-
-