呜呜呜。。。今天因为晚上有点事。。。结果在实验室没有eclipse,用的命令行,结果环境变量没配好,搞了半天。。弄到现在。。哎。。
1.查看对象域的关键方法是Field类中的get方法。
Field f = c1.getDeclareFields("name");
Object value = f.get(obj); //value是obj 中name域的当前值。
3.如果一个java程序没有受到安全管理器的控制,就可以覆盖访问控制。
4.Field,Method和Constructor对象的setAccessible方法可以越过安全管理访问。
f.setAcceessible(true);
6.也可以通过set方法设置obj对象的f域的值。
f.set(obj,value);
测试类
import java.util.ArrayList;
public class Testee
{
public static void main(String[] args)
{
ArrayList<Integer> s = new ArrayList<>();
for(int i = 1; i <=5 ; i++)
{
s.add(i*i);
}
System.out.println(new ObjectAnalyzer().toString(s));
}
}
import java.lang.reflect.*;
import java.util.*;
public class ObjectAnalyzer
{
private ArrayList<Object> v = new ArrayList<>();
public String toString(Object obj)
{
if(obj == null)
return "null";
if(v.contains(obj))
return "...";
v.add(obj);
Class c1 = obj.getClass();
if(c1 == String.class)
return (String)obj;
if(c1.isArray())
{
String r = c1.getComponentType() + "[]{";
for(int i = 0; i < Array.getLength(obj);i++)
{
if(i > 0)
r +=",";
Object val = Array.get(obj,i);
if(c1.getComponentType().isPrimitive())
r += val;
else
r += toString(val);
}
return r + "}";
}
String r = c1.getName();
do
{
r += "[";
Field[] fields = c1.getDeclaredFields();
AccessibleObject.setAccessible(fields,true);
for(Field f:fields)
{
if(!Modifier.isStatic(f.getModifiers()))
{
if(!r.endsWith("["))
r += ",";
r += f.getName() + "=";
try
{
Class t = f.getType();
Object val = f.get(obj);
if(t.isPrimitive())
r += val;
else
r += toString(val);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
r += "]";
c1 = c1.getSuperclass();
}
while(c1 != null);
return r;
}
}
哎。。没有eclipse的console好看啊。。
原文地址:http://blog.csdn.net/zhurui_idea/article/details/44763403