源码详解Java的反射机制

理理java的基础,反射机制。

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


和大多定义一样,就是让人必须一字字斟酌才懂,简单的说,java反射机制的意思就是 通过名称得到对象(类、属性、方法)的技术。

 

提供如下功能:

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

在运行时调用任意一个对象的方法

 

这时候,可能有的人会顿悟了,原来自己一直在使用这项技术。

依照惯例,贴源码,这么看着清晰些:

  1 package nov;
  2 
  3 import java.lang.reflect.Field;
  4 import java.lang.reflect.Method;
  5 /**
  6  * 
  7  * 
  8  * <p>
  9  * Title: 反射机制测试代码 /p>
 10  * 
 11  * <p>
 12  * Description: 示例 业务类
 13  * </p>
 14  * 
 15  * <p>
 16  * Copyright: Copyright (c) 2012
 17  * </p>
 18  * 
 19  * 
 20  * @author dml@2012-11-29
 21  * @version 1.0
 22  */
 23 public class ReflectTester {
 24     public Object copy(Object object) throws Exception {
 25         // 获得对象的类型
 26         Class<?> classType = object.getClass();
 27         System.out.println("Class:" + classType.getName());
 28 
 29         // 通过默认构造方法创建一个新的对象
 30         Object objectCopy = classType.getConstructor(new Class[] {})
 31                 .newInstance(new Object[] {});
 32 
 33         // 获得对象的所有属性
 34         Field fields[] = classType.getDeclaredFields();
 35 
 36         for (int i = 0; i < fields.length; i++) {
 37             Field field = fields[i];
 38             // 属性名称
 39             String fieldName = field.getName();
 40             // 得到属性名称的第一个字母并转成大写
 41             String firstLetter = fieldName.substring(0, 1).toUpperCase();
 42             // 获得和属性对应的getXXX()方法的名字:get+属性名称的第一个字母并转成大写+属性名去掉第一个字母,
 43             // 如属性名称为name,则:get+N+ame
 44             String getMethodName = "get" + firstLetter + fieldName.substring(1);
 45             // 获得和属性对应的setXXX()方法的名字
 46             String setMethodName = "set" + firstLetter + fieldName.substring(1);
 47 
 48             // 获得和属性对应的getXXX()方法
 49             Method getMethod = classType.getMethod(getMethodName,
 50                     new Class[] {});
 51             // 获得和属性对应的setXXX()方法,传入参数为参数的类型
 52             Method setMethod = classType.getMethod(setMethodName,
 53                     new Class[] { field.getType() });
 54 
 55             // 调用原对象的getXXX()方法
 56             Object value = getMethod.invoke(object, new Object[] {});
 57             System.out.println(fieldName + ":" + value);
 58             // 调用拷贝对象的setXXX()方法
 59             setMethod.invoke(objectCopy, new Object[] { value });
 60         }
 61         return objectCopy;
 62     }
 63 
 64     public static void main(String[] args) throws Exception {
 65         Customer customer = new Customer("Tom", 21);
 66         customer.setId(new Long(1));
 67         //运行时生成对象实例:类存在不带参数的构造函数 直接使用newInstance()方法
 68         Customer customerCopy = (Customer) new ReflectTester().copy(customer);
 69         System.out.println("Copy information:" + customerCopy.getId() + " "
 70                 + customerCopy.getName() + " " + customerCopy.getAge());
 71     }
 72 }
 73 
 74 public class Customer {
 75     private Long id;
 76 
 77     private String name;
 78 
 79     private int age;
 80 
 81     public Customer() {
 82     }
 83 
 84     public Customer(String name, int age) {
 85         this.name = name;
 86         this.age = age;
 87     }
 88 
 89     public Long getId() {
 90         return id;
 91     }
 92 
 93     public void setId(Long id) {
 94         this.id = id;
 95     }
 96 
 97     public String getName() {
 98         return name;
 99     }
100 
101     public void setName(String name) {
102         this.name = name;
103     }
104 
105     public int getAge() {
106         return age;
107     }
108 
109     public void setAge(int age) {
110         this.age = age;
111     }
112 }

 

注:以上代码摘自:【视频笔记】Java反射机制笔记

输入结果:

 

1 Class:nov.Customer
2 id:1

 

细细看看这段代码,然后再看理论,最后自己再理理,最后自己再写一段程序,以后做项目的时候,就又多了一个好的工具了。

 

转自 :http://www.cnblogs.com/northeastTycoon/archive/2012/12/03/2799847.html

posted @ 2012-12-20 18:44  少爵  阅读(318)  评论(0编辑  收藏  举报