hooyantsing's Blog

Field域_Method方法_Constructor构造器及其方法

字数统计: 623阅读时长: 3 min
2020/05/23

反射

Field域 Method方法 Constructor构造器及其方法

用以下Demo演示以上对象的常用方法。


ReflectionTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package reflex;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;

public class ReflectionTest {
    public static void main(String[] args) {
        String name;
        if(args.length > 0) name = args[0];
        else {
            Scanner in = new Scanner(System.in);
            System.out.println("Enter class name (e.g.java.util.Date):");
            name = in.next();
        }

        try {
            Class cl = Class.forName(name);
            Class supercl = cl.getSuperclass();
            String fodifiers = Modifier.toString(cl.getModifiers());
            if(supercl != null && supercl != Object.class) System.out.println("extends" + supercl.getName());
            System.out.println("\n{\n");
            printConstructors(cl);
            System.out.println();
            printMethods(cl);
            System.out.println();
            printFields(cl);
            System.out.println("}");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.exit(0);
    }

    //域
    private static void printFields(Class cl) {
        //获取这个类里面所有的成员变量,包含父类的成员变量。
        //如果仅获取这个类的所有成员变量,使用.getDeclaredFields()方法。
        Field[] fields = cl.getFields();

        for(Field f : fields){
            //获取成员变量的类型 返回的也是个Class对象 可以使用.getName获取类名(全名,包含包名)。
            Class type = f.getType();
            //获取成员变量的变量名。
            String name = f.getName();
            System.out.println("     ");
            //Java修饰符 如:public static final等
            //修饰符集合被表示为具有表示不同修饰符的不同位位置的整数
            //成员变量对象的.getModifiers()方法获取整数值,再通过Modifier.toString()方法解码成对应的字符串。
            //System.out.println("注意,这是Java修饰符:" + f.getModifiers());
            String modifiers = Modifier.toString(f.getModifiers());
            if(modifiers.length() > 0) System.out.println(modifiers + "");
            System.out.println(type.getName() + "  " + name + ";");
        }
    }

    //方法
    private static void printMethods(Class cl) {
        //Method方法对象
        Method[] methods = cl.getMethods();
        for(Method m : methods){
            //获取方法返回类型
            Class retType = m.getReturnType();
            String name = m.getName();
            System.out.println("     ");
            String modifiers = Modifier.toString(m.getModifiers());
            if(modifiers.length() > 0) System.out.println(modifiers + "");
            System.out.println(retType.getName() + "  " + name + "(");

            //获取方法异常参数类型
            Class[] paramTypes = m.getExceptionTypes();
            for(int j=0;j<paramTypes.length;j++){
                if(j > 0) System.out.println(",");
                System.out.println(paramTypes[j].getName());
            }
            System.out.println(");");
        }
    }

    //构造器
    private static void printConstructors(Class cl) {
        //构造器对象
        Constructor[] constructors = cl.getConstructors();
        for(Constructor c : constructors){
            String name = c.getName();
            System.out.println("     ");
            String modifiers = Modifier.toString(c.getModifiers());
            if(modifiers.length() > 0) System.out.println(modifiers + "");
            System.out.println(name + "(");

            //获取构造器形参类型
            Class[] paramTypes = c.getParameterTypes();
            for(int j=0;j<paramTypes.length;j++){
                if(j > 0) System.out.println(",");
                System.out.println(paramTypes[j].getName());
            }
            System.out.println(");");
        }
    }

}
CATALOG