java反射基礎
阿新 • • 發佈:2017-07-31
per borde exceptio cti dai private align href getpara
反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。Link
反射的主要方法
方法/屬性 |
解釋 |
getDeclaredMethods() |
獲取所有的方法 |
getReturnType() |
獲得方法的放回類型 |
getParameterTypes() |
獲得方法的傳入參數類型 |
getDeclaredMethod("方法名",參數類型.class,……) |
獲得特定的方法 |
getDeclaredConstructors() |
獲取所有的構造方法 |
getDeclaredConstructor(參數類型.class,……) |
獲取特定的構造方法 |
getSuperclass() |
獲取某類的父類 |
getInterfaces() |
取某類實現的接口 |
getDeclaredField() |
獲取聲明的指定屬性 |
getDeclaredFields() |
獲取聲明的所有屬性 |
getField() |
獲取指定屬性 |
getFields() |
獲取所有屬性 |
field.get(clazz) |
獲取類屬性 |
field.set(clazz,property); |
設置類屬性 |
反射相關的類
java.lang.Class;
java.lang.reflect.Constructor;
java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
反射訪問類的屬性 Class<?> clazz = null; try { clazz = Class.forName("com.simple.dec.advance.basic.basic1.SonClazz"); Field field= clazz.getDeclaredField("sonPwd"); field.setAccessible(true); Object result = field.get(this); ZLog.zzE(result); field.set(this, "Java反射機制"); result = field.get(this); ZLog.zzE(result); } catch (Exception e) { e.printStackTrace(); }
反射訪問類的方法 Class<?> clazz = null; try { clazz = Class.forName("com.simple.dec.advance.basic.basic1.SonClazz"); Method method = clazz.getMethod("getSonPwd"); // method.invoke(clazz.newInstance()); Object result = method.invoke(this); ZLog.zzE(result); // 不帶參數 method = clazz.getMethod("getSonEmail"); result = method.invoke(this); ZLog.zzE(result); // 帶參數,訪問私有方法 method = clazz.getDeclaredMethod("getSum",int.class,String.class); method.setAccessible(true); result = method.invoke(this,100,"isSon..."); ZLog.zzE(result); method = clazz.getMethod("getSum",int.class,String.class); result = method.invoke(this,100,"isSon..."); ZLog.zzE(result); } catch (Exception e) { e.printStackTrace(); }
參考:
Java反射機制詳解
Java 反射
JAVA反射與註解
JAVA中的反射機制
備用代碼
/** * 調用子類的某個方法 * 無法訪問私有方法 */ private void getSonMethod(){ Class<?> clazz = null; try { clazz = Class.forName("com.simple.dec.advance.basic.basic1.SonClazz"); Method method = clazz.getMethod("getSonPwd"); // method.invoke(clazz.newInstance()); Object result = method.invoke(this); ZLog.zzE(result); // 不帶參數 method = clazz.getMethod("getSonEmail"); result = method.invoke(this); ZLog.zzE(result); // 帶參數,訪問私有方法 method = clazz.getDeclaredMethod("getSum",int.class,String.class); method.setAccessible(true); result = method.invoke(this,100,"isSon..."); ZLog.zzE(result); method = clazz.getMethod("getSum",int.class,String.class); result = method.invoke(this,100,"isSon..."); ZLog.zzE(result); } catch (Exception e) { e.printStackTrace(); } } /** * 獲取子類所有方法 */ private void getSonMethodAll(){ Class<?> clazz = null; try { clazz = Class.forName("com.simple.dec.advance.basic.basic1.SonClazz"); Method method[] = clazz.getMethods(); for (int i = 0; i < method.length; ++i) { Class<?> returnType = method[i].getReturnType(); Class<?> para[] = method[i].getParameterTypes(); int temp = method[i].getModifiers(); System.out.print(Modifier.toString(temp) + " "); System.out.print(returnType.getName() + " "); System.out.print(method[i].getName() + " "); System.out.print("("); for (int j = 0; j < para.length; ++j) { System.out.print(para[j].getName() + " " + "arg" + j); if (j < para.length - 1) { System.out.print(","); } } Class<?> exce[] = method[i].getExceptionTypes(); if (exce.length > 0) { System.out.print(") throws "); for (int k = 0; k < exce.length; ++k) { System.out.print(exce[k].getName() + " "); if (k < exce.length - 1) { System.out.print(","); } } } else { System.out.print(")"); } System.out.println(); } } catch (ClassNotFoundException e) { e.printStackTrace(); } ZLog.zzE(""); } /** * 調用子類的某個屬性 * 可以直接訪問private屬性 */ private void getSonProperty(){ Class<?> clazz = null; try { clazz = Class.forName("com.simple.dec.advance.basic.basic1.SonClazz"); Field field = clazz.getDeclaredField("sonPwd"); field.setAccessible(true); Object result = field.get(this); ZLog.zzE(result); field.set(this, "Java反射機制"); result = field.get(this); ZLog.zzE(result); } catch (Exception e) { e.printStackTrace(); } } /** * 獲取子類所有屬性 */ private void getSonPropertyAll(){ Class<?> clazz = null; try { clazz = Class.forName("com.simple.dec.advance.basic.basic1.SonClazz"); System.out.println("===============本類屬性==============="); // 取得本類的全部屬性 Field[] field = clazz.getDeclaredFields(); for (int i = 0; i < field.length; i++) { // 權限修飾符 int mo = field[i].getModifiers(); String priv = Modifier.toString(mo); // 屬性類型 Class<?> type = field[i].getType(); System.out.println(priv + " " + type.getName() + " " + field[i].getName() + ";"); } System.out.println("==========實現的接口或者父類的屬性=========="); // 取得實現的接口或者父類的屬性 Field[] filed1 = clazz.getFields(); for (int j = 0; j < filed1.length; j++) { // 權限修飾符 int mo = filed1[j].getModifiers(); String priv = Modifier.toString(mo); // 屬性類型 Class<?> type = filed1[j].getType(); System.out.println(priv + " " + type.getName() + " " + filed1[j].getName() + ";"); } } catch (ClassNotFoundException e) { e.printStackTrace(); } }
java反射基礎