標籤:調用 詳解 無法 out methods dex stack name ack
反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態擷取的資訊以及動態調用對象的方法的功能稱為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反射基礎