文档章节

Java修改String对象的值

stackwill
 stackwill
发布于 2014/09/23 14:53
字数 211
阅读 121
收藏 1

使用两种方式修改String的值:

1.反射

2.Unsafe

代码示例:

import java.lang.reflect.Field;

import org.junit.Test;

import sun.misc.Unsafe;


public class ModifyString {

	/**
	 * 反射修改String
	 * @throws Exception
	 * 2014年9月23日
	 */
	@Test
	public void testReflect() throws Exception{
		String str="hello,world";
		Field f=str.getClass().getDeclaredField("value");
		f.setAccessible(true);
		char[] target=new char[]{'h','a'};
		Field c=str.getClass().getDeclaredField("count");
		c.setAccessible(true);
		c.set(str, target.length);
		f.set(str, new char[]{'h','a'});
		System.out.println(str);
	}
	
	/**
	 * Unsafe 修改String
	 * @throws Exception
	 * 2014年9月23日
	 */
	@Test
	public void testUnsafe1() throws Exception{
		String str="hello,world";
		Field f=str.getClass().getDeclaredField("value");
		f.setAccessible(true);
		
		long offset;
		Unsafe unsafe=getUnsafe();
		offset=unsafe.arrayBaseOffset(char[].class);
		char[] arr=(char[])f.get(str);
		unsafe.putChar(arr, offset, 'a');
		System.out.println(str);
	}
	
	/**
	 * Unsafe 修改String 
	 * @throws Exception
	 * 2014年9月23日
	 */
	@Test
	public void testUnsafe2() throws Exception{
		String str="hello,world";
		Field f=str.getClass().getDeclaredField("value");
		f.setAccessible(true);
		long offset;
		
		Unsafe unsafe=getUnsafe();
		char[] nstr=new char[]{'1','2'};
		offset=unsafe.objectFieldOffset(f);
		Object o=unsafe.getObject(str, offset);
		unsafe.compareAndSwapObject(str, offset, o, nstr);
		System.out.println(str);
	}
	
	public static Unsafe getUnsafe() throws Exception{
		Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe");
		theUnsafeInstance.setAccessible(true);
		return (Unsafe) theUnsafeInstance.get(Unsafe.class);
	}
}



© 著作权归作者所有

stackwill
粉丝 3
博文 3
码字总数 1607
作品 0
浦东
程序员
私信 提问
java中String对象和String变量

java中String对象和String变量 (2011-12-27 20:40:27) 转载▼ 标签: it 最近在论坛上看到关于String s = new String("XYZ") + new String("XYZ");到底创建几个对象的讨论,觉得比较有意思,......

什么是程序员
2015/08/12
77
0
Java的字符类String、StringBuffer与StringBuilder异同对比分析

Java的字符类String、StringBuffer与StringBuilder异同对比分析 Java String是一个“不可变常量字符串”对象,final属性定义。之所以这么说,是从String内部在盛放字符串时候的容器char数组而...

开开心心过
2017/10/30
0
0
java 堆 栈 方法区、对象初始化过程

<一> 基础数据类型(Value type)直接在栈(stack)空间分配,方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收。 引用数据类型,需要用new来创建,既在栈空间分配一个地址空间(...

少年已不再年少
03/12
23
0
ThreadLocal的设计理念与作用

Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量...

whoisliang
2018/02/14
111
0
05《Java核心技术》之三种字符串类有什么区别?

一、提出问题 今天,我们来聊聊日常使用的字符串,别看它似乎很简单,但其实字符串几乎在所有编程语言里都是个特殊的存在,因为不管是数量还是体积,字符串都是大多数应用中的重要组成。 今天...

飞鱼说编程
2018/09/24
52
0

没有更多内容

加载失败,请刷新页面

加载更多

PCB设计-Allegro软件入门系列-铺铜操作(下)

铺铜是PCB很常见的操作,PCB的敷铜一般都是覆地铜,增大地线面积,有利于地线阻抗降低,使电源和信号传输稳定,在高频的信号线附近敷铜,可大大减少电磁辐射干扰,起屏蔽作用。 本讲讲解啊一...

demyar
18分钟前
2
0
如何通过WASI SDK 在Linux上编译ZXing C++

Mozilla在今年三月份的时候公布了WASI。WASI的目标就是让WebAssembly在任何地方都可以运行,而不仅仅像现在这样只能运行在Node.js和Web浏览器中。WASI目前依然处于初级阶段,这篇文章分享下如...

yushulx
19分钟前
2
0
.Net界面开发神器—DevExpress官方汉化包免费下载!还在等什么?

点击获取DevExpress v19.1.7新版试用下载 DevExpress Localization Service允许您创建一组自定义的附属程序集,要将语言包添加到程序集中,请查看本文中为大家列出的对应版本的汉化包,下载并...

FILA6666
19分钟前
2
0
php生成二维码

        header('Content-Type: image/png');        //清除缓冲区,防止之前面不知道的情况下被加头部信息导致不显示图片内容        ob_clean();        $...

横着走的螃蟹
25分钟前
2
0
伪类和伪元素

伪类和伪元素 伪类和伪元素,对于绝大多数同学来说,都是耳熟能详的名字,但确实又有很多人搞不清楚它们之间的区别,以致于混淆概念。而当概念都混淆的时候,也往往意味着你不会经常使用它,...

不负好时光
27分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部