呜呜呜。。。今天因为晚上有点事。。。结果在实验室没有eclipse,用的命令行,结果环境变量没配好,,搞了半天。。弄到现在。。哎。。
1.查看对象域的关键方法是Field类中的get方法。
Field f = c1.getDeclareFields("name");Object value = f.get(obj); //value是obj 中name域的当前值。
2.反射机制的默认行为受限于java的访问控制。
3.如果一个java程序没有受到安全管理器的控制,就可以覆盖访问控制。
4.Field,Method和Constructor对象的setAccessible方法可以越过安全管理访问。
f.setAcceessible(true);5.setAccessible方法是AccessibleObject类中的一个方法,它是Field,Method和Constructor类的公共超类。
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;elser += 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;elser += toString(val);}catch(Exception e){e.printStackTrace();}}}r += "]";c1 = c1.getSuperclass();}while(c1 != null);return r;}}打印结果
哎。。没有eclipse的console好看啊。。
伟人之所以伟大,是因为他与别人共处逆境时,