在java反射機(jī)制中,代表java類型的Class<?>對(duì)象有兩個(gè)獲得類字段的方法getFields和getDeclareFields,這兩個(gè)方法的區(qū)別如下
getFields方法
返回一個(gè)Field類型數(shù)組,其中包含當(dāng)前類的public字段,如果此類繼承于某個(gè)父類,同事包括父類的public字段。其它的proteced和private字段,無論是屬于當(dāng)前類還是父類都不被此方法獲取。
getDeclareFields方法
返回一個(gè)Field類型數(shù)組,結(jié)果包含當(dāng)前類的所有字段,private、protected、public或者無修飾符都在內(nèi)。另外,此方法返回的結(jié)果不包括父類的任何字段。 此方法只是針對(duì)當(dāng)前類的。
代碼示例
public class MainSuper {
public int publicField;
protected long protecedField;
private String privateField;
public static int staticPublicField;
protected static long staticProtectedField;
private static String staticPrivateField;
}
public class Main extends MainSuper {
public int publicField;
protected long protectedField;
private String privateField;
public static int staticPublicField;
protected static long staticProtectedField;
private static String staticPrivateField;
public static void main(String[] args) {
System.out.println("getFields方法");
System.out.println("..................................................");
printFields(Main.class.getFields());
System.out.println("--------------------------------------------------");
System.out.println("getDeclaredFields");
System.out.println("..................................................");
printFields(Main.class.getDeclaredFields());
}
private static void printFields( Field[] fields ) {
for(Field field : fields) {
System.out.println(field);
}
}
}
執(zhí)行結(jié)果如下
getFields方法
..................................................
public int Main.publicField
public static int Main.staticPublicField
public int MainSuper.publicField
public static int MainSuper.staticPublicField
--------------------------------------------------
getDeclaredFields
..................................................
public int Main.publicField
protected long Main.protectedField
private java.lang.String Main.privateField
public static int Main.staticPublicField
protected static long Main.staticProtectedField
private static java.lang.String Main.staticPrivateField
相似的方法
與獲得字段的方法對(duì)應(yīng),獲得方法、內(nèi)部類、構(gòu)造方法也有對(duì)應(yīng)的方法
getMethods
getDeclaredMethods
getClasses
getDeclaredClasses
getConstructors
getDeclaredConstructors
訪問私有成員
當(dāng)我們通過 getDeclaredXXX 系列方法獲得私有成員時(shí),默認(rèn)是無法訪問的,強(qiáng)行訪問會(huì)報(bào)類似的錯(cuò)誤
java.lang.IllegalAccessException: Class client.Debugger can not access a member of class client.ClientServer with modifiers "private static final"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
要使私有成員能訪問,進(jìn)行如下調(diào)用即可
field.setAccessible(true);