利用反射机制改变String的值
来源:互联网 发布:python 正则匹配 开始 编辑:程序博客网 时间:2024/05/22 23:19
前言
在很多的面试中会被问到有关String和StringBuffer的区别,简单来说就是:
一个变量和常量的关系。
StringBuffer对象的内容可以修改;
而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象。
学过了反射机制,知道了其是非常强大的,那么String指向的地址的值真的不能改变吗?
答案是否定的!
为什么说String的值是不可改变的?
看如下的代码:
package com;/** * @author 张俊强~ * @time 2017/06/18 * @function 打印String的值 * */public class ReflectApply1 { public static void main(String[] args) { // TODO Auto-generated method stub String str="str1"; System.out.println(str.hashCode()); str="str2"; System.out.println(str.hashCode()); }}
我们来看一下输出的结果:
35410243541025
可知这个str
在重新赋值后,它指向的地址其实是已经发生改变了的!
我们来看一下String
类的源码:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; //后面省略 }
可知String是一个被final修饰的字符数组,所以String的值确实是不可改变的!
利用反射机制来改变String的值
首先我们看源码知道String类有属性char value[]
,我们可以利用反射机制获取这个属性,然后改变其值不就可以改变String的值了吗?
代码如下:
package com;import java.lang.reflect.Field;/** * @author 张俊强~ * @time 2017/06/18 * @function 改变String的值 */public class ReflectApply1 { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub String str = "不可变的字符串"; System.out.println(str.hashCode()+":"+str); //改变前的hash值 Field f = str.getClass().getDeclaredField("value"); //获取value属性 f.setAccessible(true); //设置其可以被访问(private) f.set(str, new char[] { '改', '变', '后', '的', '值' }); //改变其值 System.out.println(str.hashCode()+":"+str); //改变后的hash值 }}
输出结果:
-459725323:不可变的字符串-459725323:改变后的值
可知对应的在修改了String的值后其相应的hash值未发生改变。
后记
为什么String类型要设置成fianl类型的呢?其实原因有很多,主要原因是String类型在Java中使用的次数是非常频繁的,如果每次改变都需要重新销毁再赋值的话,就会大量调用GC,设置成fianl也是为了减少GC的次数嘛(GC是非常耗时的)。
具体可以看看知乎的回答:https://www.zhihu.com/question/31345592
阅读全文
0 0
- 利用反射机制改变String的值
- 利用反射来改变String对象
- 利用Java反射机制改变SharedPreferences存储路径
- 利用Java反射机制改变SharedPreferences存储路径
- 利用Java反射机制改变SharedPreferences存储路径
- Java中,利用反射机制修改定义出来的String对象本身。
- 一个利用java反射机制的例子
- 利用java的反射机制模拟hibernate
- 反射机制和MetaData的简单利用
- String类型的值能够被反射改变和常量池的理解
- 改变viewPager滑动的速度,利用反射完美实现
- php反射机制以及利用php反射机制实现可插拔可扩展的插件架构
- 利用java反射机制比较同一个bean的两个对象的值是否相同
- 利用java反射机制比较同一个bean的两个对象的值是否相同
- 利用java的反射机制得到类的信息
- 利用c#的反射机制得到类的信息
- 利用java反射机制实现List<Map<String, Object>>转化为List<JavaBean>
- 利用反射机制设计Dao
- ajax 跨域 headers JavaScript ajax 跨域请求 +设置headers 实践
- 压缩 解压文件
- Spring MVC 拦截器
- 数组中有一个数字出现的次数超过数组长度的一半
- c语言学习笔记6.18下午
- 利用反射机制改变String的值
- Problem D 牛栏(aggr)
- 【es6】数组
- yii2中添加全局静态函数
- Mac 系统怎么安装和配置MySQL呢?
- Problem:E 探险
- latex入门——数学公式
- linux中文件系统的挂载,及各种类型的实现试验
- python中datetime模块中datetime对象的使用方法