Java反射具有强大的功能,可以很方便的在程序运行的时候再来加载相应的代码,处理一个类中的所有结构。Java反射是在整个Java部分难度比较大的内容,主要是因为Java反射非常抽象,但是正是因为其功能强大,在实际的应用中使用非常多,因此学好Java反射,对于Java开发大有裨益。学好Java反射,最好的途径就是尽量多的掌握其在具体的开发中的操作,只有尽可能多的练习,才能很好的灵活运用Java反射。接下来通过反射实现基于set方法的依赖注入,来更好的应用Java反射。
创建dao层代码
分别创建接口:IDepartmentDao和IEmployeeDao,分别创建其实现类DepartmentDao和EmployeeDao,代码如下。
public interface IDepartmentDao {
public void add();
public void delete();
public void update();
}
public interface IEmployeeDao {
public void add();
public void delete();
public void update();
}
public class DepartmentDao implements IDepartmentDao {
public void add() {
System.out.println("添加部门测试");
}
public void delete() {
System.out.println("删除部门测试");
}
public void update() {
System.out.println("修改部门测试");
}
}
public class EmployeeDao implements IEmployeeDao {
public void add() {
System.out.println("添加员工测试");
}
public void delete() {
System.out.println("删除员工测试");
}
public void update() {
System.out.println("修改员工测试");
}
}
创建相应的service代码
分别创建接口:IDepartmentService和IEmployeeService,分别创建其实现类DepartmentService和EmployeeService,代码如下。
public interface IDepartmentService {
public void add();
public void delete();
public void update();
}
public interface IEmployeeService {
public void add();
public void delete();
public void update();
}
public class DepartmentService implements IDepartmentService {
public void add() {
}
public void delete() {
}
public void update() {
}
}
public class EmployeeService implements IEmployeeService {
public void add() {
}
public void delete() {
}
public void update() {
}
}
以前如果想访问各dao中的方法,必须手动创建相关dao对象,然后才能访问。现在有了反射以后,我们就可以利用反射实现set方法依赖注入就可以轻松访问dao中的方法了。
在src目录下创建一个dao.properties文件,用以存放对象名到类名的映射关系,具体内容为:
departmentDao=com.obj.dao.impl.DepartmentDao
employeeDao=com.obj.dao.impl.EmployeeDao
创建DaoFactory用来读取dao.properties文件,通过传入相应的对象名来创建相应的对象,具体代码为:
public class DaoFactory {
/**
* 根据相应的对象名称字符串获取相应类的全名称
*/
public static Object getDao(String daoName) {
Object obj = null;
Properties prop = new Properties();
//读取dao.properties文件
InputStream is = Thread.currentThread()
.getContextClassLoader().getResourceAsStream("dao.properties");
try {
prop.load(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获取类的全名
String className = prop.getProperty(daoName);
try {
//加载相应的类
Class clz = Class.forName(className);
//创建类的对象
obj = clz.newInstance();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}
}
创建BaseService,在其中处理依赖注入
public class BaseService {
//把类的首字母变成小写
private String firstCharLower(String fieldName) {
StringBuffer sb = new StringBuffer();
sb.append((fieldName.charAt(0) + "").toLowerCase());
sb.append(fieldName.substring(1));
return sb.toString();
}
public BaseService() {
//获取当前类中所有的方法
Method[] methods = this.getClass().getDeclaredMethods();
for(Method method:methods) {
//寻找以set开头的方法
if(method.getName().startsWith("set")) {
//去掉set字符串,接下来的字符串首字母变成小写
String name = this.firstCharLower(method.getName().substring(3));
//从DaoFactory类中获取相应的创建完成的对象
Object obj = DaoFactory.getDao(name);
try {
//调用set方法并且赋值
method.invoke(this, obj);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
接下来让所有的service类继承BaseService类,其中定义相应的Dao属性,并提供相应的set方法,就可以轻松访问dao类的相关内容了。以EmployeeService为例演示具体的实现过程,具体的代码为:
public class EmployeeService extends BaseService implements IEmployeeService {
private IEmployeeDao employeeDao;
public void setEmployeeDao(IEmployeeDao employeeDao) {
this.employeeDao = employeeDao;
}
public void add() {
employeeDao.add();
}
public void delete() {
employeeDao.delete();
}
public void update() {
employeeDao.update();
}
}
创建测试代码,测试相应的功能,代码如下
public class TestDI {
@Test
public void test01() {
IEmployeeService employeeService = new EmployeeService();
employeeService.add();
}
}
通过测试可以发现Dao中的方法得到了成功的调用。
1404

被折叠的 条评论
为什么被折叠?



