本帖最后由 司懿卓 于 2013-3-7 16:02 编辑
代码: 通过暴力访问得到成员变量数组,在循环中不用设置可见访问,就可以直接操作.
- import java.lang.reflect.*;
- class ReplaceDemo
- {
- private String name = "abcd";
- private int num = 163;
- private String str = "bedg";
- private ReplaceDemo(){}
- public static void main(String[] args) throws Exception
- {
- ReplaceDemo rd = new ReplaceDemo();
- System.out.println("替换前: " + rd);
- rd.replaceChar("b", "a");
- System.out.println("替换后: " + rd);
- }
- public void replaceChar(String oldChar, String newChar) throws Exception
- {
- Field[] fields = this.getClass().getDeclaredFields(); //暴力访问
- for(Field field : fields){
- if(field.getType() == String.class){
- String oldVal = (String)field.get(this);
- String newVal = oldVal.replace(oldChar, newChar);
- field.set(this, newVal); //更新成员变量值
- }
- }
- }
- public String toString()
- {
- return "[name:" + name + " num:" + num + " str:"+ str + "]";
- }
- }
复制代码 如果类成员变量和主程序(包括功能方法)在同个类里时,功能方法内部可以通过this来替代对象.
这时,通过暴力访问私有成员变量,是不用设置访问可见的. 就四 setAccessible(true); 方法
代码2:- package com.itheima;
- import java.lang.reflect.*;
- public class PrivateFieldDemo {
- public static void main(String[] args)throws Exception{
- Demo demo = new Demo();
- replace(demo);
- }
- public static void replace(Object obj) throws Exception{
- Field[] fields = obj.getClass().getDeclaredFields();
- for(Field field : fields){
- field.setAccessible(true); //访问可以必须设置
- if(field.getType() == String.class){
- String oldVal = (String)field.get(obj);
- String newVal = oldVal.replace("a", "qqq");
- field.set(obj,newVal);
- System.out.println((String)field.get(obj));
- }
- }
- }
- }
- class Demo{ //实例类和主程序分离
- private String name = "ablckddnsdfsdfsdf";
- private String test = "aldkjfskfbsdkfjsdkf";
- public String toString(){
- return name + ": " + test;
- }
- }
复制代码 如果类成员变量和主程序分开两个类时,功能内部通过传入对象来操作.
这时,通过暴力访问私有变量成员,必须设置访问可见,否则无法JVM报告无法找到该成员变量.
这里面具体是为什么呢? 如果第一种情况时,把暴力访问方法修改为普通方法,是无法访问的. 应该不是内部可见,外部不可见的问题.
求真相..
|
|