依赖注入的方法有三种:构造子、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那些怎么实现,所以写着玩的。实际框架中当然要比这个复杂的多的多的多。