您的位置:首页 > 编程语言 > Java开发

Java反射setAccessible()方法

2016-04-15 10:20 501 查看
本文源于:http://blog.csdn.net/kjfcpua/article/details/8496911


setAccessible()方法

java代码中,常常将一个类的成员变量置为private

 

在类的外面获取此类的私有成员变量的value时,需要注意:

 

测试类:

Java代码  



public class AccessibleTest {  

  

    private int id;  

    private String name;  

  

    public AccessibleTest() {  

  

    }  

  

    public int getId() {  

        return id;  

    }  

  

    public void setId(int id) {  

        this.id = id;  

    }  

  

    public String getName() {  

        return name;  

    }  

  

    public void setName(String name) {  

        this.name = name;  

    }  

  

}  

 

Main类:

Java代码  



public class Main {  

  

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

        Class clazz = Class.forName("com.test.accessible.AccessibleTest");  

        AccessibleTest at = new AccessibleTest();  

        at.setId(1);  

        at.setName("AT");  

        for (Field f : clazz.getDeclaredFields()) {  

            f.setAccessible(true);//AccessibleTest类中的成员变量为private,故必须进行此操作  

            System.out.println(f.get(at));//获取当前对象中当前Field的value  

        }  

  

    }  

  

}  

如果没有在获取Field之前调用setAccessible(true)方法,异常:

Java代码  



 java.lang.IllegalAccessException:  

Class com.test.accessible.Main   

can not access   

a member of class com.test.accessible.AccessibleTest  

with modifiers "private"  

 

当然在AccessibleTest类的内部(AccessibleTest的内部类除外)

进行如上操作则不需要调用setAccesible()方法

import java.lang.reflect.Field;

public class Test {

public static void main(String[] args) throws Exception, IllegalAccessException  {
A a = new B();
System.out.println(a.get());
B b = new B();
System.out.println(b.get());
Class cl = b.getClass();
Field[] fields = cl.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
System.out.println(field.getName()+","+field.get(b));
}

}

}

class A{
private int i=4;
private int j=3;
public int get(){
return i;
}

}

class B extends A{
private int i = 5;

public int get(){
return i;
}

}

输出:

5

5

i,5
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: