加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

依赖注入

发布时间:2020-12-14 05:41:55 所属栏目:百科 来源:网络整理
导读:依赖注入的方法有三种:构造子、seter、接口,在网上看到一个写的模拟构造子注入的代码,在我电脑上运行的时候发现一点问题,改了些东西就可以运行了,下面是代码: import java.lang.reflect.Constructor;interface ConstructorParamDeal {public Object []

依赖注入的方法有三种:构造子、seter、接口,在网上看到一个写的模拟构造子注入的代码,在我电脑上运行的时候发现一点问题,改了些东西就可以运行了,下面是代码:

import java.lang.reflect.Constructor;

interface ConstructorParamDeal {
	public Object [] dealParam(Class [] classes);
}
class RefectHelper{
	public Object ConstructorHelper(String className,ConstructorParamDeal pd) throws Exception{
		try{
			// 取得构造函数
			Constructor[] constructs = Class.forName(className).getDeclaredConstructors();
			System.out.println(constructs.length);
			// 默认使用第一个构造函数创建实例
			Class [] classes= constructs[0].getParameterTypes();
			// 获取要注入的参数实例
			Object []obj=pd.dealParam(classes);
			return constructs[0].newInstance(obj);
		}catch(Exception e){
			throw e;
		}
	}
}
class ParamDeal implements ConstructorParamDeal{
	public Object [] dealParam(Class[] classes) {
		Object [] obj=new Object[classes.length];
		for (int i=0;i<obj.length;i++){
			if (classes[i].equals(String.class)){
				obj[i]="Hello World";                                       
			}
		}
		return obj;
	}
}
public class Test{
	public String a,b;
	Test(String a,String b){
		this.a = a;
		this.b = b;
	}
	Test(){
		this.a = "a";
		this.b = "b";
	}
	public static void main(String[] arg) throws Exception{
		RefectHelper refectHelper = new RefectHelper();
		Test t = (Test) refectHelper.ConstructorHelper("Test",new ParamDeal());
		System.out.println(t.a+" "+t.b);
	}
}

而通过下面的代码大概模拟一下setter注入的方法:

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test{
	private String 	a;
	private String 	b;	
	public String getA() {
		return a;
	}
	public void setA(String a) {
		this.a = a;
	}
	public String getB() {
		return b;
	}
	public void setB(String b) {
		this.b = b;
	}
	public static void main(String[] arg) throws Exception{
		Field[] fields = Class.forName("Test").getDeclaredFields();
		String name;
		Test t = new Test();
		for(int i = 0; i < fields.length; i++){
			name = "set"+fields[i].getName().substring(0,1).toUpperCase()+fields[i].getName().substring(1);
			Class[] param = new Class[1];
			param[0] = fields[i].getType();
			Method func = Class.forName("Test").getMethod(name,param);
			func.invoke(t,"a");
		}
		for(int i = 0; i < fields.length; i++){
			name = "get"+fields[i].getName().substring(0,1).toUpperCase()+fields[i].getName().substring(1);
			Method func = Class.forName("Test").getMethod(name);
			
			System.out.println(func.invoke(t));
		}
	}
}
这些代码只是在看书的时候看到,然后好奇Spring那些怎么实现,所以写着玩的。实际框架中当然要比这个复杂的多的多的多。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读