getDeclaredField是可以獲取一個類本身的所有字段.
getField只能獲取類及其父類的public 字段.
public Field getDeclaredField(String name) throws NoSuchFieldException, SecurityException { checkMemberaccess(Member.DECLARED, ClassLoader.getCallerClassLoader()); Field field = searchFields(PRivateGetDeclaredFields(false), name); if (field == null) { throw new NoSuchFieldException(name); } return field; } rivate Field getField0(String name) throws NoSuchFieldException { Field res = null; // Search declared public fields if ((res = searchFields(privateGetDeclaredFields(true), name)) != null) { return res; } ...... getField其實調用的是getField0. 他們最后都調用了searchFields. 不過getDeclaredField傳入的是privateGetDeclaredFields(false), getField傳入的是privateGetDeclaredFields(true), private Field[] privateGetDeclaredFields(boolean publicOnly) { checkInitted(); Field[] res = null; if (useCaches) { clearCachesOnClassRedefinition(); if (publicOnly) { if (declaredPublicFields != null) { res = (Field[]) declaredPublicFields.get(); } } else { if (declaredFields != null) { res = (Field[]) declaredFields.get(); } } 可以看到傳入條件為true的時候使用的是declaredPublicFields,意思是public字段 為false的時候使用的是declaredFields. 當然declaredFields和declaredPublicFields最終的來源是 private native Field[] getDeclaredFields0(boolean publicOnly); 可惜這是個native方法.感覺java就是很無奈,發現都是native方法檔在路上.新聞熱點
疑難解答