这两个方法都是用于获取字段
1.getField 只能获取public的,包括从父类继承来的字段。
2.getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。 (注: 这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true))
public class DemoTest {
@Test
public void testField2() throws Exception {
UserController userController = new UserController();
Class<? extends UserController> clazz = userController.getClass();
/* Field[] declaredFields = clazz.getDeclaredFields();
Arrays.asList(declaredFields).stream().forEach(System.out :: println);*/
UserService userService = new UserService();
Field userServiceField = clazz.getDeclaredField("userService");
userServiceField.setAccessible(true);
//userServiceField.set(userController,userService);
String name = userServiceField.getName();
name = name.substring(0,1).toUpperCase()+name.substring(1,name.length());
String setMethodName = "set" + name;
Method method = clazz.getMethod(setMethodName, UserService.class);
method.invoke(userController,userService);
System.out.println(userController.getUserService());
}
}
public class UserController {
private UserService userService;
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
public class UserService {
}