Java反射机制Java反射机制
反射机制实现DI
1. IOC(Inversion of Control)模式与DI(Dependency Injection)方式
IOC模式称为反转控制,其意义在于将编写好的类交给容器去控制,而并不需要在类内部控制。
IOC模式是解决调用者和被调用者之间的一种关系,将被调用者名称写入了调用者的代码中,产生了一个接口实现的原罪:彼此联系,调用者和被调用者有紧密联系,在UML中是用依赖 Dependency 表示。
IOC模式极大的降低了组件的耦合度降低,提高了组件的可移植性。其将类与类之间的紧密关...
Java反射机制
反射机制实现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 patt
ern》提出。
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] == Stri
ng.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().getDeclaredMeth
ods();
//获取StringObject的指定方法
java.lang.reflect.Method method = StringObject.getClass().getDeclaredMethod
(concat,String.getClass());
//将字段设置值
method.invoke(StringObject, "concatvalue "); 总结:简单讲述了用Java反射机制实现DI方式的方法,一般执行的步骤如下:
Step1: 通过类名获得类对象
Step2: 获得我们想要的构造方法对象
Step3: 调用构造方法,创建对象
Step4: 获得想要调用的方法对象或者字段
Step5: 对创建好的对象调用指定的方法或者字段
本文档为【Java反射机制】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。