反射

匿名 (未验证) 提交于 2019-12-02 21:53:52
 
Java里,无论生成某个类的多少对象,这些对象都会对应于同一个Class对象。
Java的反射机制允许程序在运行时透过Reflection APIs(反射api)取得任何一个已知名称的class的所有内部信息。

1、反射有什么用

可以这么说,其实java类的成员变量、方法是不是private没有关系,运用反射就完全可以玩转类的私有变量和私有方法。正是因为反射的这两部分使用才有了hibernatespring等框架,换言之,没有反射就没有框架!
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
 
文章来源: 反射
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!