当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

利用反射获取与修改private的属性的值

发表于: 2012-11-16   作者:BBjava   来源:转载   浏览次数:
摘要: 1.PrivateObject.java 可以看到PrivateObject 里有一个private 的属性String型的 privateString 没有为其实义getter,setter方法。 package org.iteye.bbjava.runtimeinformation; import java.lang.reflect.Field; public c
1.PrivateObject.java

可以看到PrivateObject 里有一个private 的属性String型的 privateString
没有为其实义getter,setter方法。

package org.iteye.bbjava.runtimeinformation;

import java.lang.reflect.Field;

public class PrivateObject {

	private String privateString = null;

	public PrivateObject(String privateString) {
		this.privateString = privateString;
	}

}


2.Test.java
这里将对PrivateObject类进行反射取值,是一种“暴力操作”,相信经常逛论坛的同学们,应该听过这个词。
还可以“暴力修改”。

package org.iteye.bbjava.runtimeinformation;

import java.lang.reflect.Field;

public class Test {
	 public static void main(String []args) throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchFieldException{
		  PrivateObject privateObject = new PrivateObject("The Private Value");

		  Field privateStringField = PrivateObject.class.
		              getDeclaredField("privateString");

		  privateStringField.setAccessible(true);

		  String fieldValue = (String) privateStringField.get(privateObject);
		  System.out.println("fieldValue = " + fieldValue);
	  }
}


3.console infomaction:
引用
fieldValue = The Private Value


4.接下来将对Test.java进行修改,以对“暴力修改”是如何做到的进行说明。
对比上面的Test.java这里多了8行代码,这就是“暴力修改”的关键。
其中  privateStringField.setAccessible(true); 就是对private 属性修改的“权限开关”,当设置为true时,可以修改,为false时会抛出异常,动行时信息将会给出该异常.

package org.iteye.bbjava.runtimeinformation;

import java.lang.reflect.Field;

public class Test {
	 public static void main(String []args) throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchFieldException{
		  PrivateObject privateObject = new PrivateObject("The Private Value");

		  Field privateStringField = PrivateObject.class.
		              getDeclaredField("privateString");

		 
		  
		  privateStringField.setAccessible(true);
		  String fieldValue = (String) privateStringField.get(privateObject);
		  System.out.println("fieldValue = " + fieldValue);

		  
		  privateStringField.setAccessible(true);
		  privateStringField.set(privateObject, "As you see,privateString's value is changed!");
		  String fieldValue1 = (String) privateStringField.get(privateObject);
		  System.out.println("fieldValue = " + fieldValue1);

		  privateStringField.setAccessible(false);
		  privateStringField.set(privateObject, "As you see,privateString's value is changed!");
		  String fieldValue2 = (String) privateStringField.get(privateObject);
		  System.out.println("fieldValue = " + fieldValue2);
	  }
}



5.console infomaction:
引用
fieldValue = The Private Value
fieldValue = As you see,privateString 'value is changed!
Exception in thread "main" java.lang.IllegalAccessException: Class org.iteye.bbjava.runtimeinformation.Test can not access a member of class org.iteye.bbjava.runtimeinformation.PrivateObject with modifiers "private"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
at java.lang.reflect.Field.doSecurityCheck(Field.java:960)
at java.lang.reflect.Field.getFieldAccessor(Field.java:896)
at java.lang.reflect.Field.set(Field.java:657)
at org.iteye.bbjava.runtimeinformation.Test.main(Test.java:25)

利用反射获取与修改private的属性的值

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
利用private font改变PDF文件的字体 前几天做项目,需要使用未安装的字体来改变PDF的文件。以前并没
新办了一张信用卡,注册了Amazon的AWS,在上面试着搭建了Virtual Private Network. 具体步骤如下:
反射技术动态获取属性 知道struts2的流程的乡亲们都知道。struts2采用了动态获取属性的方法, 将表
  本文属于原创,转载时请标明出处! 折磨了我一个晚上的问题,奈何对物理的反射印象太深了,整天
今天写一个Json.net比较偏门的用法,也许你很久都用不到,也许你明天就能派上用场。 我们都知道 Jso
今天写一个Json.net比较偏门的用法,也许你很久都用不到,也许你明天就能派上用场。 我们都知道 Jso
点击菜单栏中的 ”Preference“ ,依次展开”Preferences -> Package Settings -> Emmet ->
一般而言,我在做修改页面的多选框进行选中的时候,我都会controller层把已选的和未选的分别放在两
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <me
-----转载(IE8 下) 在最近所做的一个项目中,要求用jquey easyUi控件来做一个工资核算的展示页面,
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号