是否所有的字段都可以通过setAccessible方法来获得其值?并且可以通过set方法来改变??如果上述所说的都正确的话JAVA的封装不就全给破坏了吗?附上一个例子,这个例子可以访问private字段,但我没有修改成功。
import java.lang.reflect.*;
import java.util.*;
import java.text.*;
public class ObjectAnalyzerTest
{
        public static void main(String [] args)
        {
                ff te=new ff();
                Object obj=te;
                System.out.println(new ObjectAnalyzer().toString (obj));
        }
}
class ObjectAnalyzer
{
        public String toString (Object obj)
        {
                if(obj==null) return "null";
                if(Visited.contains(obj))  return"...";
                Visited.add(obj);
                Class cl=obj.getClass();
                if(cl==String.class) return (String)obj;
                if(cl.isArray())
                {
                        String r=cl.getComponentType()+"[]{";
                        for(int i=0;i<Array.getLength(obj);i++)
                        {
                                if(i>0)r+=",";
                                Object val=Array.get(obj,i);
                                if(cl.getComponentType().isPrimitive()) r+=val;
                                else r+=toString(val);
                        }
                        return r+")";
                }
                String r=cl.getName();
                do{
                        r+="[";
                        Field[] fields=cl.getDeclaredFields();
                        AccessibleObject.setAccessible(fields,true);
                        
                        for(int i=0;i<fields.length;i++)
                        {
                                Field f=fields[i];
                                
                                
                                 if(!Modifier.isStatic(f.getModifiers()))
                                {
                                        if(!r.endsWith("[")) r+=",";
                                        r+=f.getName()+"=";
                                        try
                                        {
                                                
                                                Class t=f.getType();
                                                Object val=f.get(obj);
                                                //f.set(val,"300");
                                                if(t.isPrimitive()) r+=val;
                                                else r+= toString(val);
                                        }
                                        catch(Exception e){e.printStackTrace();}
                                }
                        }
                        r+="]";
                        cl=cl.getSuperclass();
                }
                while (cl!=null);
                return r;
        }
        private ArrayList Visited=new ArrayList();
}