一:反射概念

可以通过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     }