Loading

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:

如果,您希望更容易地发现我的新博客,不妨点击一下关注。

如果你觉得本篇文章对你有所帮助,请给予我更多的鼓励,

因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【肥肥也】!

 

 

posted @ 2020-08-24 17:57  A零号  阅读(405)  评论(0编辑  收藏  举报