我的java学习笔记(13)关于反射(part 2)

呜呜呜。。。今天因为晚上有点事。。。结果在实验室没有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好看啊。。

伟人之所以伟大,是因为他与别人共处逆境时,

我的java学习笔记(13)关于反射(part 2)

相关文章:

你感兴趣的文章:

标签云: