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;
}
}