浅析Java反射机制
目前,在项目中使用Java反射机制(除Spring框架)的地方不多,但为后续准备,简单将最近的反射体会总结如下:
1. 按光学中的反射,可以将java中的反射理解为“镜像”。有以下用途:
Java反射机制主要提供下面几种用途:
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
2. 使用java的反射机制,一般需要遵循三步:
- 获得类的Class对象
- 取得操作类的方法或属性名
- 操作第二步取得的方法或属性
3. 获得类的Class对象,有3种方法:
1. 调用Class的静态方法forName
2. 使用类的.class语法,如:Class<?> cls = String.class
3. 调用对象的getClass方法
4. 在Java的反射机制中,类与Class对象对应;类方法与Method对应;类属性与Field对应。
5. 在获得类的方法、属性、构造函数时,会有getXXX和getDeclaredXXX两种对应的方法。区别在于前者返回的是访问权限为public的方法和属性,包括父类中的;后者返回的是所有访问权限的方法和属性,但不包括父类的。
6. 实例:用反射机制完成对象的copy (浅复制)
public static void main(String[] args) {
Student student = new Student();
student.setStuAge(29);
student.setStuName("Chris");
Persons persons = new Persons();
persons.setFriend("Chen");
persons.setTeacher("All people");
student.setPersons(persons);
Student copyStu = copyObject(student);
System.out.println("-------- " + copyStu.getStuName() + " : " + copyStu.getStuAge() + " - " +copyStu.getPersons().getFriend() + " - " + copyStu.getPersons().getTeacher());
student.getPersons().setTeacher("hehe");
System.out.println("-------- " + copyStu.getStuName() + " : " + copyStu.getStuAge() + " - " +copyStu.getPersons().getFriend() + " - " + copyStu.getPersons().getTeacher());
}
Persons类:
public class Persons {
private String friend;
private String teacher;
public String getFriend() {
return friend;
}
public void setFriend(String friend) {
this.friend = friend;
}
public String getTeacher() {
return teacher;
}
public void setTeacher(String teacher) {
this.teacher = teacher;
}
}
Student类:
public class Student {
/** 姓名 */
private String stuName;
/** 年龄 */
private int stuAge;
/** Persons */
private Persons persons;
public Persons getPersons() {
return persons;
}
public void setPersons(Persons persons) {
this.persons = persons;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getStuAge() {
return stuAge;
}
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
}
copyObject方法:
private static <T> T copyObject(T t) {
Class<?> cls = t.getClass();
Field[] fields = cls.getDeclaredFields();
T o = null;
try {
o = (T)cls.newInstance();
for (Field field : fields){
field.setAccessible(true);
Object o1 = field.get(t);
field.set(o,o1);
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return o;
}
在写copyObject方法时,尝试了下泛型方法。原来泛型方法中的标志<T>是必须的。
由以上例子可知,即使用反射机制来实现copy对象的功能,也只能是浅复制。
由这个例子延伸到copy对象的实现上,如下:
http://blog.sina.com.cn/s/blog_70e6618b0100om09.html
(1) 对象复制分浅复制和深复制。二者的区别在于对非基本数据类型的复制上。前者复制引用,后者复制子对象。
(2) 浅复制对象:
1. 实现方式:
第一步:实现java.lang.Cloneable接口;
第二步:重写java.lang.Object.clone()方法,设置方法为public
2. Object类中的clone()方法是native的,执行效率更高。但执行的仍是浅复制!!!所以,重写的clone()方法执行浅复制。
(3) 深复制对象:
实现方式有多种:
1. new对象以及子对象,全部重新设置属性;
2. 所有非基本数据类型的属性,对应的类实现Cloneable接口并重写clone()方法;
3. 使用对象序列化与反序列化。
浅析Java反射机制的更多相关文章
- Java 反射机制浅析
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反 ...
- Java反射机制浅析
概念 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
- java基础知识(十一)java反射机制(上)
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
- java基础知识(十一)java反射机制(下)
1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...
- Java反射机制专题
·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方 ...
- java反射机制深入详解
java反射机制深入详解 转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...
- Java反射机制DOME
Java反射机制 public class TestHibernate { @Test public void TestHb(){ try { Class cs = Class.forName(&qu ...
随机推荐
- PHP生成随机字符串包括大小写字母
PHP生成随机字符串包括大小写字母,这里介绍两种方法: 第一种:利用字符串函数操作 <?php /** *@blog <www.phpddt.com> */ function cre ...
- jquery中each()函数
今天在使用each函数时,发现写的js代码明明木有问题,为什么点击没有执行呢.js始终处于入门阶段,只好瞎鼓捣. 弄了半天,总算可以了.代码如下: <script type="text ...
- Oracle与SQL Server事务处理的比较
事务处理是所有大型数据库产品的一个关键问题,各数据库厂商都在这个方面花费了很大精力,不同的事务处理方式会导致数据库性能和功能上的巨大差异.事务处理也是数据库管理员与数据库应用程序开发人员必须深刻理解的 ...
- 【转】操作ini文件
一.INI文件的结构: ; 注释 [小节名] 关键字=值 INI文件有多个小节,每个小节又有多个关键字, “=”后面是该关键字的值. 值的类型有三种:字符串.整型数值和布尔值. 其中字符串存贮在IN ...
- Delphi XE5 for android 图片缩放和拖动处理
首先,需要分辨手势的类型. 有两种类型的手势: 一是标准手势(Standard Gestures): 在Windows,android上,标准手势都是用一个手指. 在Mac OS X and iOS上 ...
- 新成员!Visual Studio Code --跨平台的开发工具(支持OSX, Linux 和 Windows)
原文出处:新成员!Visual Studio Code --跨平台的开发工具(支持OSX, Linux 和 Windows) 这是我的文章备份 http://www.dotblogs.com.tw/ ...
- Requests:Python HTTP Module学习笔记(二)(转)
在上一篇日志中对Requests做了一个整体的介绍,接来下再介绍一些高级的用法,主要资料还是翻译自官网的文档,如有错漏,欢迎指正. 参考资料:http://docs.python-requests.o ...
- try-catch-finally中return语句的执行
catch里return后还会执行finally吗??在java里,是的.但是值得注意的是,在存在try-catch-finally的方法中,return可能出现的位置有4个,在try中,在catch ...
- Linux分区
硬盘分区主要分为基本分区和扩展分区两种,基本分区和扩展分区的数目之和不能大于四个.且基本分区可以马上被使用但不能再分区.扩展分区必须再进行分区后才能进行使用,也就是说它必须进行二次分区.扩展分区再分下 ...
- SQL开发 循序渐进
吉庆师傅整理: http://www.itpub.net/thread-1418150-1-1.html