您的位置:首页 > 编程语言 > Java开发

java学习之 反射机制

2015-12-18 10:49 316 查看
参考自 http://www.cnblogs.com/gulvzhe/archive/2012/01/27/2330001.html

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。当然反射本身并不是一个新概念,它可能会使我们联想到光学中的反射概念,尽管计算机科学赋予了反射概念新的含义,但是,从现象上来说,它们确实有某些相通之处,这些有助于我们的理解。
Java反射机制主要提供下面几种用途:
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法

使用java的反射机制,一般需要遵循三步:
1. 获得你想操作类的Class对象
Class<?> cls = Class.forName(“java.lang.String”);// 获得Class
2. 通过第一步获得的Class对象去取得操作类的方法或是属性名
Method[] methods = cls.getMethods();// 通过Class获得所对应对象的方法
Method method = cls.getMethod("show", String.class);// 通过Class获得DisPlay类的show方法
Field[] fromFields = cls.getDeclaredFields();// 取得拷贝源对象的属性列表
3. 操作第二步取得的方法或是属性
method.invoke(disPlay, "Wanggc");// 调用show方法
String name = fromField.getName();// 取得拷贝源对象的属性名字
fromField.get(from)// 获取拷贝源对象的属性的值
Field destField = destClass.getDeclaredField(name);// 取得拷贝目标对象的相同名称的属性
destField.set(obj, fromField.get(from));// 将拷贝源对象的属性的值赋给拷贝目标对象相应的属性

fromField.setAccessible(true);// 设置属性的可访问性
destField.setAccessible(true);

Java运行的时候,某个类无论生成多少个对象,他们都会对应同一个Class对象,它表示正在运行程序中的类和接口。如何取得操作类的Class对象,常用的有三种方式:

1. 调用Class的静态方法forName,如上例;
2. 使用类的.class语法,如:Class<?> cls = String.class;
3. 调用对象的getClass方法,如:String str = "abc";Class<?> cls = str .getClass();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  fava 反射