一:反射概念
可以通过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 }