/** *create date: 2016年2月19日下午3:18:33 *update date: 2016年2月19日下午3:18:33 */ import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * @author liuwb */ public class ReflectTrip { public static void main(String[] args) { // 1.學習如何獲取 Class對象 ReflectTrip.getClassForReflect(); // 2.學習reflect類庫(Field,Method,Constructor,Array) ReflectTrip.learnReflectClass(); } /** * 1.獲取Class對象的三種方式 * * @author liuwb * @since JDK 1.8 */ public static void getClassForReflect() { Class<?> cls = null; try { // 1.經過Class類獲取class對象; cls = Apple.class; // 2.經過Class實例獲取class對象; cls = new Apple(null, null).getClass(); // 3.經過Class類名稱獲取class對象; cls = Class.forName("cn.com.aben.reflect.main.Apple"); } catch (ClassNotFoundException e1) { e1.printStackTrace(); } System.out.print(String.valueOf(1) + ".class對象爲:\t"); System.out.println(cls != null ? cls.getName() : "null"); } public static void learnReflectClass() { Apple ap = null; // 一.經過反射實例化對象的兩種方式 try { // ap = Apple.class.newInstance(); //一般用於無參實例化 ap = Apple.class.getConstructor(new Class<?>[] { String.class, String.class }) .newInstance(new Object[] { "", "" }); } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { e.printStackTrace(); } Method[] methods = null; Method method = null; // 二.經過反射獲取並調用class對象的方法 try { // 1.獲取class對象的所有方法(含超類,不含私有) methods = Apple.class.getMethods(); for(Method data : methods) { System.out.println("二.1.\t" + data.getName() + "\t" + data.getModifiers() + "\t" + data.getReturnType()); } // 2.獲取class對象的聲明方法(含私有,不含超類) methods = Apple.class.getDeclaredMethods(); for(Method data : methods) { System.out.println("二.2.\t" + data.getName() + "\t" + data.getModifiers() + "\t" + data.getReturnType()); } // 3.獲取class對象指定名稱的方法(含超類,不含私有) method = Apple.class.getMethod("setName", String.class); // 4.獲取class對象指定名稱的方法(含私有,不含超類) method = Apple.class.getDeclaredMethod("setName", String.class); // 5.經過反射調用方法 method.invoke(ap, "I'm reflect invoke method excuting."); method = Apple.class.getDeclaredMethod("getName"); System.out.println(String.valueOf(2) + "." + method.invoke(ap)); } catch (Exception e) { e.printStackTrace(); } Field[] fields = null; Field field = null; // 三.經過反射獲取並調用class對象的屬性 try { // 1.獲取class對象的所有屬性(含超類,不含私有) fields = Apple.class.getFields(); for(Field data : fields) { System.out.println("三.1.\t" + data.getName() + "\t" + data.getModifiers()); } // 2.獲取class對象的聲明屬性(含私有,不含超類) fields = Apple.class.getDeclaredFields(); for(Field data : fields) { System.out.println("三.2.\t" + data.getName() + "\t" + data.getModifiers()); } // 3.獲取class對象指定名稱的屬性(含超類,不含私有) field = Apple.class.getField("name"); // 4.獲取class對象指定名稱的聲明屬性(含私有,不含超類) field = Apple.class.getDeclaredField("name"); // 5.經過反射設置屬性值(私有屬性不能設置) // field.setAccessible(true); //經過setAccessible方法使私有屬性可操做(缺點:破壞對象的封裝性) field.set(ap, "I'm field reflect."); // 6.經過反射獲取屬性值 Object name = field.get(ap); System.out.println(String.valueOf(3) + "." + name); } catch (Exception e) { e.printStackTrace(); } // 四.經過反射操做數組(Array) try { int length = 10; // 1.建立對應class對象的數組 Object array = Array.newInstance(Class.forName("java.lang.String"), length); // 2.對數組進行賦值 Array.set(array, length - 1, "nine"); // 3.獲取數組的指定下標元素 String result = (String)Array.get(array, length - 1); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } } } class Apple { public String name; private String beathday; /** * Creates a new instance of Apple. * * @param name * @param beathday */ public Apple(String name, String beathday) { super(); this.name = name; this.beathday = beathday; } /** * @return the name */ public String getName() { return name; } /** * @param name * the name to set */ public void setName(String name) { this.name = name; } /** * @return the beathday */ public String getBeathday() { return beathday; } /** * @param beathday * the beathday to set */ public void setBeathday(String beathday) { this.beathday = beathday; } }