一:反射概念
可以通过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 @Test13 // 通过反射获取类定义的变量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 @Test24 // 通过反射获取类定义的构造方法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 }