目前,在项目中使用Java反射机制(除Spring框架)的地方不多,但为后续准备,简单将最近的反射体会总结如下:

1. 按光学中的反射,可以将java中的反射理解为“镜像”。有以下用途:  

Java反射机制主要提供下面几种用途:

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法

2. 使用java的反射机制,一般需要遵循三步:

  1. 获得类的Class对象
  2. 取得操作类的方法或属性名
  3. 操作第二步取得的方法或属性

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反射机制的更多相关文章

  1. Java 反射机制浅析

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反 ...

  2. Java反射机制浅析

    概念 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...

  3. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  4. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  5. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  6. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  7. Java反射机制专题

    ·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方 ...

  8. java反射机制深入详解

    java反射机制深入详解  转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...

  9. Java反射机制DOME

    Java反射机制 public class TestHibernate { @Test public void TestHb(){ try { Class cs = Class.forName(&qu ...

随机推荐

  1. jquery click & get value of attributes of a href

    http://stackoverflow.com/questions/6625667/jquery-click-get-value-of-attributes-of-a-href /* Add a l ...

  2. 错记-checkbox radio

    很多时候我想会用到浏览器默认的单选按钮或者复选框,比如说偷懒的时候或者心情不好的时候╮(╯﹏╰)╭, 在html结构里我想实现点击文字旁边的单选按钮就跟着选中或反之,像这样:

  3. iostat命令简单说说

    tps: 每秒钟发送到的I/O请求数. Blk_read /s: 每秒读取的block数 Blk_wrtn/s: 每秒写入的block数 Blk_read: 读入的block总数 Blk_wrtn: ...

  4. Nginx配置:http重定向,URLRewrite,一个简单框架的配置思路

    一个重定向的应用配置: server { listen       8000; server_name  localhost; root F:/home/projects/test; index   ...

  5. 《Prism 5.0源码走读》Service Locator Pattern

    在Prism Bootstrapper里面取实例的时候使用 ServiceLocator模式,使用的是CommonServiceLocator库 (http://commonservicelocato ...

  6. jquery的异步获取返回值为中文时乱码解决方法

    用jqgrid异步获取列表值,遇到个问题,服务器端从数据库取到的数据没有出现中文乱码问题(日志打出来是没有乱码的),但是异步传到客户的时候却出现了乱码. 服务器端已经编码过了(UTF-8编码).开始一 ...

  7. struct的成员对齐问题-结构体实际大小问题

    struct的成员对齐 注意:为了方便说明,等号左边是每个数据单独所占长度,右边是最终空间大小,以字节为单位. 一.什么时间存在对其问题:(32位机对齐方式是按照4字节对其的,以下所有试验都是在32位 ...

  8. Windows Phone中Wallet钱包的使用

    前言 Windows Phone 8中加入了钱包Wallet这个功能,这个功能非常的有意思,开发者可以通过Wallet提供的API创建获取Wallet中的商品.统一管理用户的收集优惠券.信用卡.成员资 ...

  9. ZLG_GUI配置与函数介绍

    http://www.docin.com/p-825479457.html ZLG_GUI配置与函数介绍

  10. [转]linux时间同步

    转自:http://www.jotop.com/2012/vpsinfo_0525/439.html 美国的vps大多都是国外的时间,让我们的程序总是不适应.那么如何调整linux的时间为北京时间?修 ...