您的位置:首页 > 其它

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

2006-08-28 17:50 405 查看
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);


}




}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐