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

java反射

时间:2016-04-29 19:45:16      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:



反射:Reflection


java反射机制是在运行过程中,对于任意类,都可得知这个类的全部属性和方法(不论公有与私有),且可以任意调用它的任意方法,动态获取信息和动态调用对象方法。


反射机制与对象之间的关系如下图所示:

技术分享


反射的根源:Class类


Class类用于定义类对象的属性和方法。


获取Class类的三种方式:


1.Object类中的getClass方法

2.类.class

3.通过Class类的forName方法


获取Class类后可以:


1.创建对象

2.可以获取类属性

3.可以获取类方法


Class类的运用:


1.Class实例化对象:public T newInstance();执行无参构造方法实例化。


2.获取构造方法(运用Constructor类):

public Constructor<T>getConstructor(Class<?>... parameterTypes)

获取类的公有构造方法

public Constructor<?>[]getConstructors()

获取类的所有公有构造方法

public Constructor<T>getDeclaredConstructor(Class<?>... parameterTypes)

获取类的构造方法

public Constructor<?>[]getDeclaredConstructors()

获取类的所有构造方法


3.获取普通方法(运用Method类):

public Method getMethod(Stringname,Class<?>... parameterTypes)

获取公有普通方法

public Method[] getMethods()

获取所有公有的普通方法

public Method getDeclaredMethod(String name,Class<?>... parameterTypes)

获取普通方法

public Method[] getDeclaredMethods()

获取所有普通方法


4.获取属性的方法(Field类):

public Field getField(String name)

获取公有属性

public Field[] getFields()

获取所有公有属性

public Field getDeclaredField(String name)

获取属性

public Field[] getDeclaredFields()

获取所有属性

Class反射代码测试:


创建一个对象,获取Class反射对象,输出比较结果:

		/**********************创建对象获取Class反射对象***********************/
		Student stu = new Student();
		Student stu1 = new Student();
		Class stuClass = stu.getClass();//用对象.getClass获取Student类的反射对象
		Class stuClass1 = Student.class;//用类名.class获取Student类的反射对象
		Class stuClass2 = Class.forName("反射.Student");//用Class.forName(包名.类名)获取反射对象
		
		System.out.println(stuClass == stuClass1);
		System.out.println(stuClass == stuClass2);


结果向我们表示,Class类反射的是同一个对象:

技术分享


通过反射来调用类的构造方法:


		/************************通过Class反射创建对象*****************************/
		Student stuInstance = (Student) stuClass.newInstance();
		System.out.println(stuInstance);


打印输出对象名,调用的是toString()方法,我们通过重写toString()方法可以,修改打印对象名的输出


技术分享


如下图所示:


技术分享


通过Class获取所有的构造函数,并且通过Class的反射调用有参构造函数去创建一个对象,传入字符串Long,打印输出。


		/************************通过Class获取所有构造函数********************************/
		
		Constructor[] constructors = stuClass.getDeclaredConstructors();
		for (int i = 0; i < constructors.length; i++) {
			System.out.println(constructors[i].getName()+"   "
					+Modifier.toString(constructors[i].getModifiers()));
		}
		Constructor constructor = stuClass.getDeclaredConstructor(String.class);
		Student student = (Student) constructor.newInstance("Long");
		System.out.println(student);


代码测试与输出结果如下图:


技术分享


通过Class类获取所有普通函数名,并且调用。


		/************************通过Class获取Student所有普通函数************************/
		
		Method[] methods = stuClass.getDeclaredMethods();//获取Student里面所有普通方法
		for (Method method2 : methods) {
			System.out.println(method2);//循环迭代
		}
		Method method = stuClass.getDeclaredMethod("study", java.lang.String.class);
		method.invoke(student, "Long1");//调用公有方法
		Method primethod = stuClass.getDeclaredMethod("play");
		primethod.setAccessible(true);
		primethod.invoke(student);


调用结果如下图,调用公有方法成功,私有方法出现了异常,原因是无访问权限:


技术分享

只要再调用之前加上一句:

primethod.setAccessible(true);

就可以了,代码意思是设置方法调用不检测访问权限,结果如下图,可以调用私有方法:


技术分享


通过Class反射获取对象的全部属性,并且赋予新值。


		/*********************通过Class反射获取全部属性********************/
		Field[] fields = stuClass.getFields();
		for (Field field : fields) {
			System.out.println(field);//遍历field获取stuClass里的所有属性
		}
		Field field = stuClass.getDeclaredField("name");//获取反射属性
		field.set(student, "Long2");//为对象的属性赋值
		System.out.println("赋值后的新属性: "+field.get(student));//输出属性值
		Field field1 = stuClass.getDeclaredField("age");
		field1.set(student, 20);
		System.out.println("赋值后的新属性: "+field1.get(student));

输出结果:


技术分享


关于后续的反射方法知识拓展:

public int getModifiers()

public Annotation[]getAnnotations()

public ClassLoadergetClassLoader()

public Class<?>[]getInterfaces()

public String getName()

public boolean isAnnotation()

public boolean isEnum()

public boolean isInterface()



更多参考资料(java反射ppt):

http://download.csdn.net/my


java反射

标签:

原文地址:http://blog.csdn.net/jjfly999/article/details/51226986

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