在Java里,无论生成某个类的多少对象,这些对象都会对应于同一个Class对象。
Java的反射机制允许程序在运行时透过Reflection APIs(反射api)取得任何一个已知名称的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
如果您觉得本文有用,不妨在右下角帮忙点个推荐,或者在评论里给我一句赞美,小小的成就都是我今后继续为大家编写优质文章的动力,机甲龙拜谢!
欢迎您持续关注我的博客:)