第0步:编写业务接口及实现类
package com.bjpowernode.service;
public interface UserService {
public void addUser();
}
package com.bjpowernode.service;
import com.bjpowernode.dao.UserDao;
import com.bjpowernode.dao.UserDaoMySQLImpl;
import com.bjpowernode.dao.UserDaoOracleImpl;
/**
* 依赖关系: classA使用了classB的属性或者方法。 classA依赖classB.
* UserServiceImpl的addUser方法的实现需要依赖UserDao对象
*
*/
public class UserServiceImpl implements UserService {
//定义Dao对象
// private UserDao userDao = new UserDaoMySQLImpl();
private UserDao userDao;// = new UserDaoOracleImpl();
//可以给userDao赋值的
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void addUser() {
//调用Dao类的方法,实现插入操作
userDao.insertUser();
}
}
dao接口和实现类
package com.bjpowernode.dao;
public interface UserDao {
void insertUser();
}
package com.bjpowernode.dao;
/**
* 对象MySQL数据库的实现
*
*/
public class UserDaoMySQLImpl implements UserDao {
@Override
public void insertUser() {
System.out.println("执行了对mysql的插入操作");
}
}
package com.bjpowernode.dao;
public class UserDaoOracleImpl implements UserDao {
@Override
public void insertUser() {
System.out.println("执行了oracle的插入操作");
}
}
第一步:自定义一个文件 myobject.txt
service=com.bjpowernode.service.UserServiceImpl
myUserDao=com.bjpowernode.dao.UserDaoOracleImpl
service#userDao=myUserDao
第二步:创建容器对象 Container.java
package com.bjpowernode;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
/**
* 读取myobject.txt文件
* 1.使用反射创建对象
* 2.给对象的属性(依赖对象)赋值
*
*/
public class Container {
//使用集合保存创建好的对象
private Map<String,Object> map = new HashMap<>();
public Container(File file) throws IOException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
init(file);
}
//从Map中获取程序中使用对象
public Object getBean(String name){
Object object = null;
if( map.containsKey(name)){
object = map.get(name);
}
return object;
}
/**
* 读取文件myobject
* @param file
* @throws IOException
* @throws SecurityException
* @throws NoSuchFieldException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public void init(File file) throws IOException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String line = null;
while( (line = br.readLine()) != null ){
/*
* service=com.bjpowernode.service.UserServiceImpl
myUserDao=com.bjpowernode.dao.UserDaoMySQLImpl
service#userDao=myUserDao
*/
String [] data = line.split("=");
String left = data[0];//service#userDao
String right = data[1];//myUserDao
//区分是第三行数据
if( left.indexOf("#") > 0 ){
//第三行数据
String ref []= left.split("#");
String refLeft = ref[0];//service
String refRight = ref[1];//userDao 属性名
//从Map中取对象
Object bean = map.get(refLeft);
//反射机制获取Class
Class clazz = bean.getClass();
//获取要修改的属性 Field
Field field = clazz.getDeclaredField(refRight); //userDao属性
//允许属性赋值
field.setAccessible(true);
//给属性赋值
field.set(bean, map.get(right));
} else {
//使用反射创建对象
Object obj = makeObject(right);
//创建好的对象放入Map
map.put(left, obj);
}
}
}
//创建对象
private Object makeObject(String className){
Object object = null;
try {
//调用类的无参数构造方法创建对象
object = Class.forName(className).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return object;
}
}
第三步:编写测试类
package com.bjpowernode.test;
import java.io.File;
import java.io.IOException;
import com.bjpowernode.Container;
import com.bjpowernode.service.UserService;
public class MyTest {
public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, IOException {
//创建Service对象
// UserService service = new UserServiceImpl();
// service.addUser();
//使用配置文件表示对象的信息, 使用Contianer完成对象创建,属性赋值
String path = MyTest.class.getResource("/").getPath();
System.out.println("path:"+path);
File file = new File(path,"myobject.txt");
Container cc = new Container(file);
//从Contianer中获取对象
UserService service = (UserService) cc.getBean("service");
service.addUser();
}
}
Class类是反射机制的起源,我们得到Class类对象有3种方法:
第一种:通过类名获得
Class<?> class = ClassName.class;
第二种:通过类名全路径获得:
Class<?> class = Class.forName("类名全路径");
第三种:通过实例对象获得:
Class<?> class = object.getClass();