在Java里,无论生成某个类的多少对象,这些对象都会对应于同一个Class对象。
1、反射有什么用
可以这么说,其实java类的成员变量、方法是不是private没有关系,运用反射就完全可以玩转类的私有变量和私有方法。正是因为反射的这两部分使用才有了hibernate、spring等框架,换言之,没有反射就没有框架!
(1)运行时判断任意一个对象所属的类
(2)运行时构造任意一个类的对象
(3)运行时判断任意一个类所具有成员变量和方法
(4)运行时调用任意一个对象的方法
注意:全是运行时,java反射是运行时的行为。
2、玩转反射
(1)反射修改对象的私有成员变量
//User对象
public class User {
private int id = 1;
private String name = "大胖子";
public String getName() {
return name;
}
}
public static void main(String[] args) throws Exception {
Class<?> clazz = User.class;
User user = (User) clazz.newInstance();
Field idField = clazz.getDeclaredField("name");
idField.setAccessible(true); //放开Java对访问修饰符访问控制检查
idField.set(user, new String("小瘦子"));
System.out.println(user.getName());
}
输出结果:小瘦子
(2)反射调用对象的私有方法
//User对象
public class User {
private int id;
private void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
public static void main(String[] args) throws Exception {
Class<?> clazz = User.class;
User user = (User)clazz.newInstance();
Method setIdMethod = clazz.getDeclaredMethod("setId", new Class[]{int.class});
setIdMethod.setAccessible(true); //放开Java对访问修饰符访问控制检查
setIdMethod.invoke(user, new Object[]{1000});
System.out.println(user.getId());
}
输出结果:1000
3、补充
(1)int.class和Integer.class不是一回事。
(2)反射的其他方法如getDeclaredFields(),查询API
如果您觉得本文有用,不妨在右下角帮忙点个推荐,或者在评论里给我一句赞美,小小的成就都是我今后继续为大家编写优质文章的动力,机甲龙拜谢!
欢迎您持续关注我的博客:)
浙公网安备 33010602011771号