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

 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. ActiveMQ持久化机制和JMS可靠消息

    1.ActiveMQ持久化机制 1.1 JDBC将数据持久化到数据库 1.2 AMQ生成日志文件 1.3 KahaDB:本次磁盘生成数据文件(默认) 1.4 LevelDB:谷歌K/V数据库 1.5 ...

  2. 开源DDD设计模式框架YMNNetCoreFrameWork第二篇-增加swagger,数据库迁移,增加权限模型

    1.框架去掉application层,把HOst作为application层 2.增加swagger插件 3.增加Asp.net  Identity身份验证 源代码地址:https://github. ...

  3. (排序EX)P1583 魔法照片

    题解: 需要注意的是,快排完之后并不是按照编号从小到大的顺序输出 #include<iostream>using namespace std;int r=0;void swap(int & ...

  4. P 1034 有理数四则运算

    转跳点:

  5. PHP - 接收检验验证码 , 以JSON的形式将验证结果返回给前端

    <?php session_start(); $codeT = strtoupper(trim($_POST['codeT']));//接收前端传来的数据,转换成大写          $raw ...

  6. zabbix监控oracle之orabbix安装

    zabbix服务器安装配置 zabbixserver中安装该软件 mkdir /opt/orabbix cp orabbix-1.2.3.zip /opt/orabbix cd /opt/orabbi ...

  7. python保留小数位

    前言 保留小数位是我们经常会碰到的问题,尤其是刷题过程中.那么在python中保留小数位的方法也非常多,但是笔者的原则就是什么简单用什么,因此这里介绍几种比较简单实用的保留小数位的方法: 方法一:fo ...

  8. core_cm4.h(129): error: #35: #error directive: "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"

    今天使用 systick 的时候,只使用了头文件 core_cm4.h,结果就报错了,原因是 __FPU_PRESENT 没有定义,这个定义其实在 stm32f4xx.h 里面.所以如果要解决这个错误 ...

  9. Day 12:枚举值、枚举类

    jdk1.5新特性之-----枚举 问题:某些方法所接收的数据必须是在固定范围之内的,  解决方案: 这时候我们的解决方案就是自定义一个类,然后是私有化构造函数,在自定义类中创建本类的对象对外使用. ...

  10. 实验4&5

    [实验任务四]: 在上网时,我们经常会看到以下这种对话框,要用户输入一个验证码. 1.程序设计思想 先利用Math.random()得到一个整数,然后将其类型转换为字符类型,连接起来生成六位验证字符串 ...