呜呜呜。。。今天因为晚上有点事。。。结果在实验室没有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; 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好看啊。。
时间: 2024-11-07 10:43:25