在上一篇文章中说说java反射(1)我们已经了解了反射的基本概念以及它的原理,但是我们知道反射只能能用它来做些什么呢?
其实在我们很多已经很熟的框架中都有它的身影,例如Hibernate框架中的关联映射,Spring框架:IOC(控制反转).反射可以实现各种框架功能,接下来我们通过一个实例来写一个很小很小的框架,通过此例子来理解反射真正的价值所在.
接下来的例子主要功能是通过java反射来获取配置文件中的信息.通过配置文件,在程序运行的时候实例化所需要的类型的实例.
首先先建立一个资源文件,这里我们用config.properties来进行配置相关信息.
config.properties文件内容如下:指定类型为ArrayList类型.
ClassName=java.util.ArrayList
接下来建立一个反射测试类:
package com.tgb.java; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Collection; import java.util.Properties; /** * 通过一个小例子来演示通过反射技术实现一个简单的框架. * * @author jnqqls * @group TGB * @version 1.0 * * @comments */ public class ReflectTest { /** * @param args * @throws IOException * @throws ClassNotFoundException * @throws IllegalAccessException * @throws InstantiationException */ public static void main(String[] args) throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException { // 将文件读入数据流 InputStream ipt = new FileInputStream("config.properties"); // 创建Properties对象 Properties ppt = new Properties(); // 将数据流载入到ppt对象中. ppt.load(ipt); // 关闭占用资源. ipt.close(); // 获取配置文件中的名字. String className = ppt.getProperty("ClassName"); // 通过反射创建className所对应的类的一个实例. @SuppressWarnings("unchecked") Collection<String> collections = (Collection<String>) Class.forName( className).newInstance(); collections.add(new String("a")); collections.add(new String("b")); System.out.println(collections.size()); } }
通过测试,输出的数字为2.也就是集合中有两个对象.这里和我们通常的new是不一样的概念,我们的例子是在运行时所创建的对象,而我们常用的new是在编译的时候所生成的对象,因为可以配置我们想要的类型和生成的对象,这便为各种框架提高了支撑.
现在对框架有了一个最简单的例子,通过对反射有了一定的了解便会更进一步的了解Spring框架,对于Spring框架的铺垫就是这些.接下来会继续介绍Spring框架的使用.