码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-03-31 00:51:46      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:java   反射   安全   

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




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

标签:java   反射   安全   

原文地址:http://blog.csdn.net/zhurui_idea/article/details/44763403

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!