java实现ioc的参数传递_从零写Java Web框架——实现Ioc依赖注入

packageorg.zhengbin.ioc.test;importjava.lang.reflect.Field;importjava.lang.reflect.Method;importjava.util.HashMap;importjava.util.Map;/*** Created by zhengbinMac on 2017/4/10.*/

public classTempIoc {//Bean 容器,保存 Bean 类与 Bean 实例之间的映射关系

private static Map, Object> BEAN_MAP = new HashMap, Object>();public static voidmain(String[] args) {try{//加载类实例

Class> cla = getClazz("org.zhengbin.ioc.test.TestController");//存入 BeanMap 中(即放入 Bean 容器中)

Object instance =newInstance(cla);

BEAN_MAP.put(cla, instance);//需要时(在初始化整个 Web 框架时),从 BEAN_MAP 中获取类与类实例(即 Bean 类与 Bean 实例)

Object bean =BEAN_MAP.get(cla);//获取反射类的所有变量,getFields()是获取公开的变量

Field[] fields =cla.getDeclaredFields();for(Field field : fields) {//设置反射类 "实例" 的成员变量值

setField(bean, field, "你好");

}//获取 Bean 实例的所有方法

Method[] methods =cla.getDeclaredMethods();for(Method method : methods) {//模拟 Action 方法是否需要带入参数

Class>[] classes =method.getParameterTypes();if (classes.length == 0) {//调用方法

invokeMethod(bean, method);

}else{

invokeMethod(bean, method,"你好");

}

}

}catch(Exception e) {throw newRuntimeException(e);

}

}/*** 加载类

*@parampackageName 类的全路径地址(包名.类名)

*@returnBean 类*/

private static Class>getClazz(String packageName) {

Class>cls;try{

cls=Class.forName(packageName);

}catch(Exception e) {throw newRuntimeException(e);

}returncls;

}/*** 创建实例

*@paramcls Bean 类

*@returnBean 类的实例*/

private static Object newInstance(Class>cls) {

Object instance;try{

instance=cls.newInstance();

}catch(Exception e) {throw newRuntimeException(e);

}returninstance;

}/*** 设置成员变量值

*@paramobj Bean 实例

*@paramfield 成员变量

*@paramvalue 成员变量的赋值*/

private static voidsetField(Object obj, Field field, Object value) {try{//值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。//值为 false 则指示反射的对象应该实施 Java 语言访问检查。

field.setAccessible(true);

field.set(obj, value);

}catch(IllegalAccessException e) {

e.printStackTrace();

}

}/*** 调用方法

*@paramobj Bean 实例

*@parammethod 方法(Controller 中的 Action 方法)

*@paramargs 方法的入参

*@return方法返回值*/

private staticObject invokeMethod(Object obj, Method method, Object... args) {

Object result;try{

method.setAccessible(true);

result=method.invoke(obj, args);

}catch(Exception e) {throw newRuntimeException(e);

}returnresult;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值