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
 
posted on 2018-07-22 15:13  机甲龙  阅读(361)  评论(0编辑  收藏  举报