反射的安全性控制机制好象没有起作用

04-08-04 Azure_2003
我有这样的一个简单类:

public class GG {
	public String name = "test";
}
<p>

我想用反射机制给它动态赋值,于是我写了这样的一个类:

import java.lang.reflect.Field;
public class Test1 {
	public static void main(String[] args) {
               try {
                  Class cls = Class.forNameGG.class.getName());
	         GG gg = (GG) cls.newInstance();
		Field field = cls.getDeclaredField("name");
	      // field.setAccessible(true);			
		System.out.println((String)field.get(gg));
                  } catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SecurityException e) {		
			e.printStackTrace();
		} catch (NoSuchFieldException e) {		
			e.printStackTrace();
		} catch (InstantiationException e) {		
			e.printStackTrace();
		} catch (IllegalAccessException e) {		
			e.printStackTrace();
		}

	}

}
<p>

我发现注释掉field.setAccessible(true)和没有注释掉的结果都是一样,都打印出:

"test"

照说注释掉之后应该会抛出一个IllegalAccessException 异常,请问一下这是怎么回事?

java version "1.4.2"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.

Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)

eclipse 3.0.0

运行时没有加任何参数

    

Azure_2003
2004-08-04 16:40
还没有赋值就出现了问题,晕啊~~

Iwishyou
2004-10-24 19:33
field.setAccessible(true);

只是在 这个field是private 的时候才有效。如果这个field是public的

好像field.setAccessible(true);不会起作用,

即使你设定了

field.setAccessible(false);

还是可以修改他的值。

这是测试出来的结果。

Azure_2003
2004-10-25 13:26
哦,我明白了,setAccessible(true)方法的意思是恢复field的安全性,把它原有的权限还给它。如果为false即强性剥夺它的权限,将它充公。谢谢你的答复。

Azure_2003
2004-10-25 13:30
不好意思说反了,应该是:

setAccessible(false)方法的意思是恢复field的安全性,把它原有的权限还给它。如果为true即强性剥夺它的权限,将它充公。

默认的是保持它原有的权限。

猜你喜欢