步骤
- 定义属性注入的源(以硬盘上的txt文件为例)
- class.forName()方法得到类的映射
- 根据映射创建一个对象
- 根据源的内容对对象进行属性注入
- 返回该对象
具体步骤见下面代码
主方法
package reflect.ioc;
public class Main {
public static void main(String[] args) {
IOC ioc = new IOC();
User user = (User) ioc.getBean("reflect.ioc.User");
System.out.println("IOC创建对象如下");
System.out.println(user.toString());
}
}
User类
package reflect.ioc;
public class User {
private String name;
private int id;
public void setName(String name) {
this.name = name;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", id=" + id +
'}';
}
}
IOC类
package reflect.ioc;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Scanner;
public class IOC {
public Object getBean(String className){
File file = new File("D:\\test\\Ioc.txt");
Object object = null;
try {
Class clazz = null;
clazz = Class.forName(className);
//创建对象
object = clazz.newInstance();
//读取文件
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String value = bufferedReader.readLine();
//属性注入(DI)
//通过clazz获取对象的所有私有属性-->获取属性的名字-->拼串构造set方法
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
//获取属性名
String name = f.getName();
//获取属性类型
Class filedType = f.getType();
//构造set方法名
String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
//获取set方法
Method setMethod = clazz.getMethod(methodName,filedType);
//属性赋值
//如果属性是int等基本类型,在这里需要对value进行类型转换
if(filedType.getName().equals("int")) {
setMethod.invoke(object, Integer.parseInt(value.split(":")[1]));
}
else {
Constructor con = filedType.getConstructor(String.class);
setMethod.invoke(object, con.newInstance(value.split(":")[1]));
}
//读取文件的下一行
value = bufferedReader.readLine();
}
fileReader.close();
} catch (Exception e) {
e.printStackTrace();
}
return object;
}
}