利用Java的反射来访问private类

一般认为程序中类中如果定义了private成员变量或者private的成员函数,我们创建的对象是不能访问他们的,并且不能改变他们的值,但是在Java中还是可以利用反射的机制来改变private或public里面的值,例子如下:

//定义一个学生类
public class Students{
    private int id;
    private String name;

    public String getName() {
        return this.name;
    }

    public int getId() {
        return this.id;
    }

    private void setName(String name) {
        this.name = name;
    }
}

在上面的代码中我们会认为setName是不能够访问的,所以无法设置name属性的值,但是我们还是可以用下面的方法来改变name的属性;如下:

public Test {
    public static void main(String[] args) {
        Students st = new Students();
        // 获得对应的方法
        Method set = Students.getDeclareMethod("setName", java.lang.String.class); // 两个变量含义:1,表示要获得的方法的名称  2,表示传入变量的类型,如果有多个变量可以在后面继续写
        set.setAccessible(true); // 如果方法是private型的,必须要设置为true,如果是public则可以不设
        set.invoke(st, "王伟"); // 设置成功
        /*  上面是设置成员方法的,下面可以设置成员变量  **/
        Class cl = st.getClass();
        Field id = cl.getDeclareField("id");
        id.setAccessible(true);
        id.setInt(st, 10); // 思路跟上面一致


    }
}

当然我可以通过一些类的反射方法,来获得这个类的一些定义,如下:
Class类的常用方法:
getAnnotations 返回class对象上存在的注释
getCanonicalName 返回class中定义的底层类的规范化名称
getGenericInterfaces 返回泛型式对象类所有实现的接口
getGenericSuperclass 返回泛型式对象类所有直接继承的超类
getModifiers 返回此类或接口的修饰符
getTypeParameters 按声明顺序返回TypeVariable对象的一个数组
getConstructors 返回所有构造方法组成的数组
getDeclaredFields 返回所有非继承域组成的数组
getDeclaredMethods 返回所有非继承方法组成的数组

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值