反射机制实现DI     
1.  IOC(Inversion of Control)模式与DI(Dependency Injection)方式IOC模式称为反转控制,其意义在于将编写好的类交给容器去控制,而并不需要在类内部控制。IOC模式是解决调用者和被调用者之间的一种关系,将被调用者名称写入了调用者的代码中,产生了一个接口实现的原罪:彼此联系,调用者和被调用者有紧密联系,在UML中是用依赖 Dependency 表示。IOC模式极大的降低了组件的耦合度降低,提高了组件的可移植性。其将类与类之间的紧密关系转化为调用着与被调用着之间的关系,使关系和具体的类无关。IOC模式的思想由Martin Fowler的一篇《Inversion of Control Containers and the Dependency Injection pattern》提出。DI方式称为依赖注入,其意义在于把组件所依赖的零部件给组件安装上去,DI方式需要有个图纸(参照),通常是xml格式或者properties格式的配置文档。DI方式是IOC模式的一种实现,DI方式是以注入的形式实现IOC模式的,而IOC模式也不只有DI一种形式,还有一种常见的方式是“Dependency Lookup”,即每个组件自己去查找自己所需要的内容。因此IOC并不等同于 DI。2. 反射机制反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。3. 实现简单的DI实现DI通过使用JAVA提供的java.lang.class及java.lang.reflect两个包来实现。java.lang.class提供了获取类的方法,而java.lang.reflect提供了对类的构造函数、字段和方法的调用,下面分述这些方法的使用:调用构造函数:package com.telestone.di;import java.lang.reflect.Constructor;Class StringClass = Class.forName("java.lang.String");  //通过类名来获得这个类//下面用反射机制调用其构造函数来构造一个实例
//在构造是有2种方式:当构造函数有参数时,需要构造时携带参数。参数为空的构造函数。
String stringValue = “ditest”;
Object StringObject = null;
Constructor constructors[]=StringClass .getConstructors();  //将StringClass的全部构造函数放入Constructor数组中//循环查找是否有以String类为参数的构造函数.
int i = 0;
int constructorLength = constructors.length;
Class[] parameterTypes;
    
while(i < constructorLength)...{
    parameterTypes = constructors[i].getParameterTypes();  //获取第i个构造函数中的全部构造参量
    if ((parameterTypes.length == 1 && parameterTypes[0] == String.class))  //使用String类型为构造参量的构造函数所以在构造参量中只有一个,并且类型为String型
        break;
    i++;
}
    
//若存在则用String类为参数进行构造不是的话则用空实现构造.若没有空实现则抛出无可实现构造函数.
if (i < constructorLength)
    StringObject = constructors[i].newInstance(stringValue);  //使用预先设置的String值来构造该函数
else
    StringObject = StringClass .newInstance();  //这种方法只能构造空参数构造函数
调用字段(属性)://获取StringObject的全部字段
java.lang.reflect.Field fields[]= StringObject.getClass().getDeclaredFields();//获取StringObject的指定字段
java.lang.reflect.Field field= StringObject.getClass().getDeclaredField("/*字段名称*/");//将字段设置值
field.set(StringObject, typeClass);方法调用://获取StringObject的全部方法
java.lang.reflect.Method methods[] = StringObject.getClass().getDeclaredMethods();//获取StringObject的指定方法
java.lang.reflect.Method method = StringObject.getClass().getDeclaredMethod(concat,String.getClass());//将字段设置值
method.invoke(StringObject,"concatvalue");
总结:简单讲述了用Java反射机制实现DI方式的方法,一般执行的步骤如下:Step1: 通过类名获得类对象 
Step2: 获得我们想要的构造方法对象
Step3: 调用构造方法,创建对象
Step4: 获得想要调用的方法对象或者字段
Step5: 对创建好的对象调用指定的方法或者字段