Java中的反射




假如我们有一个学习的类  里面的东西都是私有的



例如:

public class Student {

    private String name;
    private int number;
    private String address;
    public String sex;

    

    public Student(String name, int number, String address, String sex) {
        super();
        this.name = name;
        this.number = number;
        this.address = address;
        this.sex = sex;
    }

    public Student() {
        super();
    }

    public void show() {

        System.out.println("我是student类的show方法");

    }


    @Override
    public String toString() {
        return "Student [name=" + name + ", number=" + number + ", address="
                + address + ", sex=" + sex + "]";
    }

}


这样就要用到我们的反射了 


例如:

public class Test {
    
    public static void main(String[] args) throws Exception {

        Class<?> c = Class.forName("反射.Student");//获取文件字节码文件
        Constructor cons = c.getDeclaredConstructor(String.class,int.class,String.class,String.class);//获取所有的构造方法
        System.out.println(cons);
        cons.setAccessible(true);//暴力访问
        Object obj = cons.newInstance("张三",10086,"北京市","男");
        System.out.println(obj);
        
        //获取方法属性
        Method show = c.getDeclaredMethod("show");
        System.out.println(show);
        show.invoke(obj);
        
        //修改属性里的值
        Field name = c.getDeclaredField("name");
        name.setAccessible(true);
        name.set(obj, "李四");
        System.out.println(obj);
        
        Field number = c.getDeclaredField("number");
        number.setAccessible(true);
        number.set(obj, 10000);
        System.out.println(obj);

    }




或者我们也可以用第二种方法


例如:


Class<?> c = Class.forName("反射.Student");
        Constructor<?> con = c.getDeclaredConstructor(String.class, int.class,
                String.class, String.class);
        System.out.println(con);
        con.setAccessible(true);

        Object obj = con.newInstance("名字", 10086, "北京市", "女");
        System.out.println(obj);

        // 获得方法的属性
        Field me = c.getField("show");
        me.setAccessible(true);
        System.out.println(me);
        
        
        
        //修改属性
        Field name = c.getDeclaredField("name");
        name.setAccessible(true);
        name.set(obj, "张三");
        System.out.println(obj);





这样就可以拿到私有方法中的私有属性,私有方法了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值