spring基础_不new用反射找对象

168 阅读1分钟

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