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两步做的事情.

你可能感兴趣的:(Java,JavaWeb)