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

 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. opencv python训练人脸识别

    总计分为三个步骤 一.捕获人脸照片 二.对捕获的照片进行训练 三.加载训练的数据,识别 使用python3.6.8,opencv,numpy,pil 第一步:通过笔记本前置摄像头捕获脸部图片 将捕获的 ...

  2. 吴裕雄--天生自然C++语言学习笔记:C++ 数据结构

    C/C++ 数组允许定义可存储相同类型数据项的变量,但是结构是 C++ 中另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项. 结构用于表示一条记录,假设想要跟踪图书馆中书本的动态,可能需要 ...

  3. jedis哨兵模式的redis组(集群),连接池实现。(客户端分片)

    java 连接redis 我们都使用的 是jedis  ,对于redis这种频繁请求的场景我们一般需要对其池化避免重复创建,即创建一个连接池 ,打开jedis的 jar包我们发现,jedis对池已经有 ...

  4. 解决Tomcat在idea控制台乱码问题

    解决Tomcat乱码问题 打开Tomcat安装目录:apache-tomcat-9.0.14-windows-x64/conf/logging.properties 大概在50多行注释这一句#java ...

  5. 小程序实现倒计时:解决ios倒计时失效(setInterval失效)

    在使用之前需要先在page页引入wxTimer.js文件(这里我将文件放在/utils) let timer = require('../../utils/wxTimer.js'); 然后就可以使用啦 ...

  6. Dubbo与SpringCloud

    dubbo和springcloud都是微服务框架,各自有各自的注册中心. dubbo监控中心:zookeeper,redis 提供高性能和透明化的RPC远程调用方案,SOA服务治理方案. 核心部分: ...

  7. 剑指offer_2.1_Day_5

    输入一个链表,按链表从尾到头的顺序返回一个ArrayList. import java.util.ArrayList; public class Solution { public ArrayList ...

  8. Ajax校验用户名是否可用

    准备 导包:DBUtil,JDBC,C3P0 在src下导入c3p0-config.xml 导入JDBCUtil 创建数据库 第2.3.条查看https://blog.csdn.net/weixin_ ...

  9. 全面掌握Nginx配置+快速搭建高可用架构 一 Nginx的访问控制

    语法 示例 allow 127.0.0.1; deny all; 缺点:局限性 如果通过代理就可以绕过访问限制,限制不准确 解决 1. http_x_forwarded_for 2. 结合geo模块作 ...

  10. 用UICollectionView实现上下轮播的案例

    // //  RecommendNewsCell.swift //  XMLYFM // //  Created by Domo on 2018/8/2. //  Copyright © 2018年 ...