使用Reflect变态修改String值的方法。

import java.lang.reflect.Field;

public class ModifyStr {

 public static void ModifyString(String s){
  String tmp = "想改就改,怎么着吧";
  Class cls = s.getClass();
  
   try {
    Field offset = cls.getDeclaredField("offset");
   offset.setAccessible(true);
   offset.setInt(s, 0);
   
   Field count = cls.getDeclaredField("count");
   count.setAccessible(true);
   count.setInt(s, tmp.length());
   
   Field value = cls.getDeclaredField("value");
   value.setAccessible(true);
   value.set(s, tmp.toCharArray());
  } catch (SecurityException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (NoSuchFieldException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalArgumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 }

 public static void main(String[] args){
  // TODO Auto-generated method stub
  String s = "什么都行";
  ModifyString(s);
  System.out.println(s);
 }

}
 

import java.lang.reflect.Field;
public class SwapString {
 public void swap(String str1, String str2){
  String tmpStr = new String(str1);
  Class cls = String.class;
 
  try {
   Field offset = cls.getDeclaredField("offset");
      Field count = cls.getDeclaredField("count");
      Field value = cls.getDeclaredField("value");
     
      offset.setAccessible(true);
      count.setAccessible(true);
      value.setAccessible(true);
     
      offset.setInt(str1, 0);
      count.setInt(str1, str2.length());
      value.set(str1, str2.toCharArray());
     
      offset.setInt(str2, 0);
      count.setInt(str2, tmpStr.length());
      value.set(str2, tmpStr.toCharArray());
  } catch (SecurityException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (NoSuchFieldException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalArgumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 public static void main(String[] args) {
  SwapString ss = new SwapString();
  String s1 = "String1";
  String s2 = "String2";
  System.out.println("Before Swap :/n s1 = "+s1+", s2 = "+s2);
  ss.swap(s1, s2);
  System.out.println("After Swap :/n s1 = "+s1+", s2 = "+s2);
 }

}


import  java.lang.reflect.Field;
public   class  SwapString  {
public void swap(String str1, String str2){
Class cls 
= String.class;
try {
Field offset 
= cls.getDeclaredField("offset");
Field count 
= cls.getDeclaredField("count");
Field value 
= cls.getDeclaredField("value");

offset.setAccessible(
true);
count.setAccessible(
true);
value.setAccessible(
true);

int offset1 = offset.getInt(str1);
int count1 = count.getInt(str1);
Object value1 
= value.get(str1);

int offset2 = offset.getInt(str2);
int count2 = count.getInt(str2);
Object value2 
= value.get(str2);

offset.setInt(str1, offset2);
count.setInt(str1, count2);
value.set(str1, value2);

offset.setInt(str2, offset1);
count.setInt(str2, count1);
value.set(str2, value1);
}
 catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

public static void main(String[] args) {
SwapString ss 
= new SwapString();
String s1 
= "String1";
String s2 
= "String2";
System.out.println(
"Before Swap :  s1 = "+s1+", s2 = "+s2);
ss.swap(s1, s2);
System.out.println(
"After Swap :  s1 = "+s1+", s2 = "+s2);
}


}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值