是否所有的字段都可以通过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();
}
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();
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货