一:反射概念
可以通过Class类获取某个类的成员变量以及方法,并且调用之。
二:通过反射获取方法、变量、构造方法
1 @Test
2 // 通过反射获取类定义的方法
3 public void testMethod() throws Exception {
4 @SuppressWarnings("rawtypes")
5 Class clazz = Class.forName("java.lang.String");
6 Method[] m = clazz.getDeclaredMethods();
7 for (int i = 0; i < m.length; i++) {
8 System.out.println(m[i].getName() + " " + m[i].getDeclaringClass());
9 }
10 }
11
12 @Test
13 // 通过反射获取类定义的变量
14 public void testField() throws Exception {
15 @SuppressWarnings("rawtypes")
16 Class clazz = Class.forName("java.lang.String");
17 Field[] fields = clazz.getFields();
18 for (Field f : fields) {
19 System.out.println(f.getName());
20 }
21 }
22
23 @Test
24 // 通过反射获取类定义的构造方法
25 public void testConstructor() throws Exception {
26 @SuppressWarnings("rawtypes")
27 Class clazz = Class.forName("java.lang.String");
28 @SuppressWarnings("rawtypes")
29 Constructor[] cons = clazz.getConstructors();
30 for (@SuppressWarnings("rawtypes")
31 Constructor c : cons) {
32 System.out.println(c + " " + c.getDeclaringClass());
33 }
34 }
三:通过反射调用类定义的方法
1 @Test
2 // 通过反射调用类定义的方法
3 public void testInvokeMethod() throws Exception {
4 Class clazz = Class.forName("java.lang.String");
5 // 定义参数类型
6 Class[] params = new Class[1];
7 params[0] = String.class;
8 Method m = clazz.getDeclaredMethod("indexOf", params);
9 // 设置参数
10 Object[] p = new Object[1];
11 p[0] = "e";
12 Integer s = (Integer) m.invoke("helloworld!", p);
13 System.out.println(s);
14 }