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

 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. hibernate保存失败

    报错:org.hibernate.jdbc.BdatchedTooManyRowsAffectedException: Batch update returned unexpected row cou ...

  2. 二十三、SAP中内表的修改

    一.通过MODIFY关键字来修改内表的内容,it相当于全部内容,wa相当于一条内容 二.效果如下

  3. junit基础学习之-参数初始化(5)

    package swust.edu.cn.postdoctors.service.impl; import java.util.Arrays; import java.util.Collection; ...

  4. 使用dbcp连接mysql

    1.创建dbcp.properties 文件 driver=com.mysql.jdbc.Driver url=jdbc:mysql:///zhang username=root password= ...

  5. filter滤镜兼容ie的rgba属性

    要在一个页面中设置一个半透明的白色div.这个貌似不是难题,只需要给这个div设置如下的属性即可: background: rgba(255,255,255,0.1); 但是要兼容到ie8.这个就有点 ...

  6. mui下拉刷新 上拉加载

    a页面是父页面   b页面是子页面 在b页 html+ js+ 下拉和上拉执行的函数就不贴了 .在这个过程中还遇到了个问题就是刷新的图标偏上 需要改变其高度,需要在a页面里面去改变刷新图标的样式 本文 ...

  7. c语言寒假大作战

    一.表格 问题 回答 这个作业属于那个课程 2019级计科一班 这个作业要求在哪里 寒假大作战01 这个作业的目标是 gitee注册.登录.上传文件.克隆仓库与 git基础命令学习与使用 作业正文 作 ...

  8. 二十、CI框架数据库操作之查看生产的sql语句

    一.代码如下: 二.我们访问一下: 三.我们对比一下数据库内容 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.

  9. Flexslider插件实现图片轮播、文字图片相结合滑动切换效果

    插件下载: 点击下载 密码: fbeg Flexslider具有以下特性: 支持滑动和淡入淡出效果. 支持水平.垂直方向滑动. 支持键盘方向键控制. 支持触控滑动. 支持图文混排,支持各种html元素 ...

  10. 完美的代价(swap成回文串、贪心)

    Description 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的.小龙龙认为回文串才是完美的. 现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串 ...