Java学习笔记_反射_Class.forName()加载并修改一个类的私有成员变量

我相信实例比文字更能说明问题

Demo1,被加载的类

package com.text.hl;

public class Demo1 {
    private int  hl;  
}

在这里我用junit单元测试测试的,去方法中加载Demo1类获得其私有成员变量并改变其值为指定的值,这里为200.大家也可以将此方法写在自己定义的类的Main方法中执行.依个人习惯和喜好而定.

@Test
    public void testGetDemo1(){
    try {
        Object demo1=Class.forName("com.text.hl.Demo1").newInstance();
        // 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
        Field field=demo1.getClass().getDeclaredField("hl");
        //跳过权限访问检查--暴力反射
        field.setAccessible(true);
        // 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
        field.set(demo1, 200);
        //返回指定对象上此 Field 表示的字段的值。
        System.out.println(field.get(demo1));
    } catch (Exception e) {
        e.printStackTrace();
    }
    }

这是文档中的两个方法,帮助大家理解.
这里写图片描述
这里写图片描述
如果需要更深层次理解,下面有一些参考博客:
参考地址1:http://yanwushu.sinaapp.com/class_forname/
参考地址2:http://www.cnblogs.com/shosky/archive/2011/07/22/2114290.html
本人为了帮助大家理解,下面是本人通过查询文档和各种资料之后理解的东西,如有纰漏欢迎指出修改意见.
加载的Demo1这个类,通常我们想调用这个类中的方法和变量(当然都是public的) 就需要这样Demo1 demo= new Demo1();创建一个这个类的实例.也就是这个类的对象.这样就可以使用它了.
现在我们不通过new的方式获得它的对象(实例),通过反射的方式,Class.forName();类加载器,加载这个类,获得的是这个类的class对象,也就是其在JVM中class对象(万物皆对象),现在获得的只是相当于Demo1.getClass();类加载到JVM中的字节码,这时我们需要调用newInstance方法获得这个类的实例(对象),这样就可以使用它了.

也就是说new是一步完成了,forName和newInstance两步做的事情.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值