日期:2014-05-20  浏览次数:20912 次

getFileds()和getDeclaredFields()的区别怎么回事
API 1.6 中有这样一段描述:

getFields
public Field[] getFields()
                  throws SecurityException返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果类或接口没有可访问的公共字段,或者表示一个数组类、一个基本类型或 void,则此方法返回长度为 0 的数组。 
特别地,如果该 Class 对象表示一个类,则此方法返回该类及其所有超类的公共字段。如果该 Class 对象表示一个接口,则此方法返回该接口及其所有超接口的公共字段。 
该方法不反映数组类的隐式长度字段。用户代码应使用 Array 类的方法来操作数组。 

getDeclaredFields
public Field[] getDeclaredFields()
                          throws SecurityException返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何字段,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。


从API上来看,getFields()和getDeclaredFields()的区别只在于一个访问公共字段、并返回无特定排序的数组,另一个是访问所有字段,并返回一个数组!

但是!我却碰到了相当郁闷的一幕
请看我下面的代码:
public class AClone {
public static void main(String[] args) 
{
String name ;
if(args.length>0){
name = args[0];
}
else
{
Scanner sa = new Scanner(System.in);
System.out.println("Enter class name (e.g. java.util.Date):");
name = sa.next() ;
}
try{
Class cl = Class.forName(name);
Class supercl = cl.getSuperclass();
String modifiers = Modifier.toString(cl.getModifiers());
if(modifiers.length() > 0 ){
System.out.println(modifiers + "");
}
System.out.println("class"+ name);
if( supercl != null && supercl != Object.class ) System.out.println("extends "+supercl.getName());
System.out.println("\n{\n");
printFields(cl);
System.out.println("}");
}catch(ClassNotFoundException err){err.printStackTrace();}
}

private static void printFields(Class cl) {
Field[] fields = cl.getClass().getFields();
for (Field field : fields) {
Class type = field.getType() ;
String name = field.getName() ;
System.out.println("   ");
String modifiers = Modifier.toString(cl.getModifiers());
if ( modifiers.length() > 0 ) {