Java反射机制 之 获取类的 方法 和 属性(包括构造函数)

把自己立成帆,才能招来凤。

运行环境

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方法也可以获取到。
getDeclaredMethods()返回所有private和public方法名,getDeclaredMethods()获取不到父类中的方法,只能获取到本来中的方法。
getMethod()返回指定字段名public的方法名。
getDeclaredMethod()返回指定字方法名的private和public字段名。
getConstructors()不能获取到父类的构造方法,getDeclaredConstructors()也只能获取到本类中的构造方法

ps:
如果,您希望更容易地发现我的新博客,不妨点击一下关注。
如果你觉得本篇文章对你有所帮助,请给予我更多的鼓励,
因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【肥肥也】!

你可能感兴趣的:(Java反射机制 之 获取类的 方法 和 属性(包括构造函数))