在上一篇文章中说说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框架的使用.