Java反射(一)
经过这两天的重构,Grape 的内核基本上已经完成了。和大多数 Java 框架一样,Grape 中同样使用了反射机制在运行期间创建对象实例。在此分次为大家简单介绍一下 Java 反射机制的使用。
我们都知道,在 Java 中对象的实例是通过 new 关键字来创建的。不过,这种方法属于硬编码,不易改变,不灵活。比如在程序中硬编码创建的 Employee 对象,若要使用 Manager 来代替它,只能修改代码。Java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在JavaBean 中广泛应用的一种特性。它可以让程序在运行期间加载编译期间不得而知的Class。并可以生成其实例、调用其方法、为其属性赋值。比如著名的 Hibernate 框架中就大量的使用了反射。本文通过简单的例子,简单介绍如何利用反射生成对象实例。
1、利用反射创建对象实例。
- Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
上面的代码是否很熟悉?我们经常使用的 JDBC 驱动加载就是使用反射完成的。以上代码仅加载了对象到内存,若要得要对象的实例只需调用 Class 的 newInstance 方法即可。
2、创建构造中带有参数的对象实例。
Java 允许一个类拥有多个构造方法,并且可以在构造对象时传入参数用来初始化对象。比如 Employee 对象的构造方法需要一个 String 的参数,用来告诉其 id 。
- public class Employee {
- private String id;
- public Employee(String id) {
- this.id = id;
- }
- }
在利用反射创建 Emplyee 对象时,我们必需为其创建 Constructor 对象,用来反映此 Class 对象所表示的类或接口的指定构造方法。
- // 生成class
- Class cls = Class.forName(className);
- // 参数类型
- Class[] types = new Class[] { String.class };
- // 类数值对象
- Object[] values = new Object[] { "001" };
- // 找到指定的构造方法
- Constructor constructor = cls.getDeclaredConstructor(types);
- // 设置安全检查,访问私有构造函数
- constructor.setAccessible(true);
- // 创建对象
- Employee e = (Employee) constructor.newInstance(values);
利用以上方法,我们就可以在运行期间加载创建对象实例,程序的灵活性也随之大大提高。
——————————- 音乐分割线 ——————————-
音频片段:需要 Adobe Flash Player ( 9 或以上版本) 播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。


















