这几天闲来无事。在网上看了一个题目,相信大家都知道这个题目

 static void change(String str){

        str="welcome";

    }

     

    public static void main(String[] args) {

        String str = "123";

        change(str);

        System.out.println(str);

    }

str =多少?

如果大家都知道 。。

然后我想把最后输出要“welcome”怎么做?

于是改成这样

  static String change(String str){

        str="welcome";

        return str;

    }

然后main里str=change(str);这结果改了,但是改的代码太多。、

我想只能改change方法。也不需要返回值,来解决问题。先看了下

String类发现 private final char value[]; 是私有的。把这个值改了不就OK了嘛

于是想到了反射:

代码如下:

static void change(String str){

        try {

            Class<?> clazz = str.getClass();

            Field fields = clazz.getDeclaredField("value");

            Object obj = fields.get(str);

            char [] charValue = (char [] )obj;

            System.out.println(charValue);

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

发现打出结果 welcome 那么只要改掉

charValue就OK了吧。于是继续加代码 发现 modifiers "private final" 会出这个错,

要加上

    field.setAccessible(true);
  try {

            Class<?> clazz = str.getClass();

            Field field = clazz.getDeclaredField("value");

            field.setAccessible(true);

            Object obj = field.get(str);

            char [] charValue = (char [] )obj;

            charValue = new char [3];

            for(int i=0;i<charValue.length;i++){

            charValue[i]='a';

            }

            field.set(str, charValue);

        } catch (Exception e) {

            e.printStackTrace();

        }

}发现能满足我的要求,。值是被改了,然后我想改变长度,于是又动一下代码charValue = new char [4];

发现值不能改变 继续看String源码,发现有个count属性,。于是又了改了这个值代码如下

 try {

            Class<?> clazz = str.getClass();

            Field field = clazz.getDeclaredField("value");

            field.setAccessible(true);

            Object obj = field.get(str);

            char [] charValue = (char [] )obj;

            charValue = new char [4];

            for(int i=0;i<charValue.length;i++){

                charValue[i]='a';

            }

             Field field1 = clazz.getDeclaredField("count");

             field1.setAccessible(true);

             field1.set(str, charValue.length);

             field.set(str, charValue);

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

发现能解决问题。

我又试了下

然后我又试下Integer 发现一样可以

代码如下:

static void changeInteger(Integer a){   

        try {

            Class<?> clazz = a.getClass();

            Field field = clazz.getDeclaredField("value");

            field.setAccessible(true);

            field.set(a, 12312);

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

个人觉得只要Field.setAccessible(true); 之后,即使是final关键字标示过得属性也可以有访问权限!这样的反射会改变JAVA的结构,甚至你的代码可维护性,你完全可以

改别的代码里面的值 ,所以这只是一个简单的例子。只是验证通过反射能做一些让你无法想象的东西。。

java反射修改静态方法的值setAccessible的更多相关文章

  1. 通过JAVA反射修改JDK1.6*当中DNS缓存内容

    时间 2012-05-28 17:09:03  Taobao QA Team原文  http://qa.taobao.com/?p=15523 为了实现性能压测时的域名动态绑定功能,尝试通过java反 ...

  2. 提高java反射速度的方法method.setAccessible(true)

    转载:http://huoyanyanyi10.iteye.com/blog/1317614 提高java反射速度的方法method.setAccessible(true) package com.c ...

  3. Java反射-修改字段值, 反射修改static final修饰的字段

    反射修改字段 咱们从最简单的例子到难, 一步一步深入. 使用反射修改一个private修饰符的变量name 咱们回到主题, 先用反射来实现一个最基础的功能吧. 其中待获取的name如下: public ...

  4. Java 反射修改类的常量值、静态变量值、属性值

    前言 有的时候,我们需要修改一个变量的值,但变量也许存在于 Jar 包中或其他位置,导致我们不能从代码层面进行修改,于是我们就用到了下面的场景,通过反射来进行修改变量的值. 定义一个实体类 class ...

  5. Java反射-修改private final成员变量值,你知道多少?

    大家都知道使用java反射可以在运行时动态改变对象的行为,甚至是private final的成员变量,但并不是所有情况下,都可以修改成员变量.今天就举几个小例子说明.  基本数据类型 String类型 ...

  6. Java反射得到属性的值和设置属性的值(转)

    package com.whbs.bean; public class UserBean { private Integer id; private int age; private String n ...

  7. Java反射得到属性的值和设置属性的值

    package com.whbs.bean; public class UserBean { private Integer id; private int age; private String n ...

  8. Java反射-修改String常量

    /* * ReflectString.java * Version 1.0.0 * Created on 2017年12月15日 * Copyright ReYo.Cn */ package reyo ...

  9. java 反射获取方法返回值类型

    //ProceedingJoinPoint pjp //获取方法返回值类型 Object[] args = pjp.getArgs(); Class<?>[] paramsCls = ne ...

随机推荐

  1. Local-Pref(本地优先属性)路由本地优先术

    Local-Pref(本地优先属性)路由本地优先术: ①:抓取感兴趣流量——前缀与访问——prefix and access ②:创建路由地图——router-map ③:第一法则——permit 1 ...

  2. Java关键字与标识符

    什么是关键字? Java语言赋予特定含义的单词被称为关键字,比如在HelloWorld中的class.public.static.void. 关键字的特点: 完全小写的字母. 在增强版的记事本当中(例 ...

  3. pycharm 配置 github 版本控制 VCS

    场景:github上没有repository,将pycharm中的工程push到github 1.在pycharm中登录github 2.新建工程后,选择“share project on githu ...

  4. mysql多表关联更新

    update 表A inner join 表B on 表A.关联字段 = 表B.关联字段 set 表a.待更新字段01 = 表B.字段01 , 表a.待更新字段021 = 表B.字段02 where ...

  5. Cheat Engine 入门操作

    Cheat Engine(简称CE,中文名-作弊引擎),用于查找.修改内存数据,是游戏逆向的基础工具. 本文仅介绍基础操作. 1.打开进程 运行游戏程序,并将CE附加到进程 2.寻找数据地址,并修改数 ...

  6. UVA - 10954 Add All (全部相加)(Huffman编码 + 优先队列)

    题意:有n(n <= 5000)个数的集合S,每次可以从S中删除两个数,然后把它们的和放回集合,直到剩下一个数.每次操作的开销等于删除的两个数之和,求最小总开销.所有数均小于10^5. 分析:按 ...

  7. linux shell的创建与启动

    1.创建shell脚本,输入linux命令: touch my.sh 2.编辑shell脚本,输入linux命令: vi my.sh 3.在shell脚本进行编辑:顺便记一次Jenkins的自动启动的 ...

  8. JS ~ 返回上一步

      <a href=" javascript:window.history.back() "> 返回上一步 </a>

  9. BZOJ 5059 前鬼后鬼的守护

    题解: 解法一:用函数斜率什么的,不会,留坑 解法二: 某一个序列都变成一个值那么中位数最优 加入一个元素,与前面那一段区间的中位数比较 x>=mid什么事也不做 x<mid合并两端区间 ...

  10. IBGP的自己下一跳,指定源命令。

    neighbor router-id update-source loopback int 当两者并不是以物理接口为搭建邻居的时候,就得使用指定源,充当TCP接口. neighbor router-i ...