spring基础_不new用反射找对象
1.思路
在UserController类里添加一个成员变量UserService,再创建一个MyTest测试类,不使用new UserService,而是用反射找到userService对象
2.代码
UserController类
public class UserController {
//注意这里是private限制符
private UserService userService;
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
UserService类
public class UserService {
}
MyTest类
public class MyTest {
@Test
public void test() throws Exception {
UserController userController = new UserController();
//为了得到Controller中的方法,属性(3中方法,这里使用.getclass()))
Class<? extends UserController> clazz = userController.getClass();
//创建对象
UserService userService = new UserService();
System.out.println("1.UserService地址");
System.out.println(userService);
//获取所有的属性
Field serviceField = clazz.getDeclaredField("userService");
//Controller中userService是私有,所以还需要设置权限
serviceField.setAccessible(true);
//只有通过方法才能设置具体的属性值
String name=serviceField.getName();
//拼接方法的名称
//userService->UserServcie
name=name.substring(0,1).toUpperCase()+name.substring(1,name.length());
String setMethodName="set"+name;
//通过方法注入属性的对象
Method method=clazz.getMethod(setMethodName,UserService.class);
System.out.println("2.method方法名");
System.out.println(method);
//反射
//invoke里是两个对象,前面是Object,后面是Object中的参数
method.invoke(userController,userService);
//经过invoke的调用,userController方法都好使了,去掉上面这句话,则下面的打印结果是null
System.out.println("3.与1形成对照的service地址");
System.out.println(userController.getUserService());
}
}
MyTest打印结果
1.UserService地址
com.mashibing.reflect.service.UserService@722c41f4
2.method方法名
public void com.mashibing.reflect.controller.UserController.setUserService(com.mashibing.reflect.service.UserService)
3.与1形成对照的service地址
com.mashibing.reflect.service.UserService@722c41f4