这两个方法都是用于获取字段
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 {
}

本文详细介绍了Java反射中`getField`和`getDeclaredField`两个方法的区别。`getField`只能获取公共字段,包括父类继承的;而`getDeclaredField`能获取类的所有字段,包括私有,但不包括继承字段。示例代码演示了如何使用`setAccessible(true)`访问私有字段并调用setter方法进行赋值。
3703

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



