我的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;
				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

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

JAVA学习笔记(六十一)- 反射Reflection

反射Reflection import java.lang.reflect.Modifier; /* * 反射Reflection * java.lang.Class类 */ public class Test01 { public static void main(String[] args) { String name = "tom"; // 方式一:通过对象getClass()方法 // 任意一个类的对象,都有一个getClass()方法 // 可以通过此获取获取当前对象的类型所

我的java学习笔记(12)关于反射(part 1)

1.能够分析类能力的程序称为反射. 2.在程序运行期间,java运行时系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息跟踪着每个对象所属的类.虚拟机利用运行时类型信息选择相应的方法执行. 3.这些保存信息的类被称为Class. 4.Object类中的getClass()方法将会返回一个Class类型的实例. String s = "hello"; Class c1 = s.getClass(); 5.如果类在一个包里,包的名字也作为类名的一部分. 6.获得类名的三种方法 a

Java学习笔记54(反射详解)

反射概念: java反射机制是在运行状态中,对于任意一个类,都能知道所有属性和方法 对于任意一个对象都能调用它的任意一个方法和属性,这种动态获取和调用的功能称为java的反射机制 实际作用: 已经完成一个java程序,但是想再添加新功能,又不能修改源码,这时候就用到反射机制了 获取class文件的三种方式: 简单地自定义一个Person类: package demo; public class Person { public String name; private int age; publi

Java学习笔记13

Object类是所有类.数组.枚举类的父类,是类层次结构的根类.每个类都使用Object作为超类.所有对象(包括 数组)都实现这个类的方法. Object类实现了以下方法: 我们来看看源码中hashCode()方法: public native int hashCode(); Object.hashCode() 就是一个哈希函数,用来计算散列值以实现哈希表这种数据结构. 返回该对象的哈希码值.支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能. has

我的java学习笔记(14)关于反射(part 3)

1.java.lang.reflect包中的Array类允许动态地创建数组. 2.在调用Array类中的静态方法newInstance是需要提供两个参数,一个是数组的元素类型,一个是数组的长度. 3.Class类的getComponentType方法可以确定数组对应的类型. 4.整型数组类型int[]可以被转换成Object,但不能转换成对象数组. 相关的实例代码 import java.lang.reflect.*; import java.util.*; public class test

Java学习笔记-13.创建窗口和程序片

1.init()方法:程序片第一次被创建,初次运行初始化程序片时调用. start()方法:每当程序片进入web浏览器中,并且允许程序片启动他的常规操作时调用(特殊的程序片被stop()关闭):同样在init()后调用. paint()方法:基础类Component的一部分(继承结构中上朔三级).作为update()的一部分调用,以便对程序片的画布进行特殊的描绘. stop()方法:每次程序片从web浏览器的视线中离开时调用,时程序片能关闭代价高昂的操作:同样在调用destroy()前调用. d

Java 学习笔记(2015.7.13~17)

Java 学习笔记(2015.7.13~17) Java this关键字 表示本类中的属性,调用本类中的方法 class Person {        private String name;         private int age;         public Person(String name, int age) {         this.name = name;//调用本类中的属性         this.age = age;//同上} //get&set方法:    

Java学习笔记——动态代理

所谓动态,也就是说这个东西是可变的,或者说不是一生下来就有的.提到动态就不得不说静态,静态代理,个人觉得是指一个代理在程序中是事先写好的,不能变的,就像上一篇"Java学习笔记--RMI"中的远程代理,其中客户端服务对象就是一个远程服务对象的代理,这个代理可以使得客户在操作时感觉像在操作本地对象一样,远程对象对于客户是透明的.我们可以看出这里的远程代理,是在程序中事先写好的,而本节我们要讨论的远程代理,是由JVM根据反射机制,在程序运行时动态生成的.(以上是本人的理解,如果有不正确的地

java学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my