String对象本身有没有什么办法可以修改?

PDD123 2014-07-10 05:05:30
java.lang.String

如题。我说的不是修改String的引用。
比如:
String a=new String("abcd");

我想在对象本身上把abcd修改成efgh能不能做到?
...全文
376 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
vnvlyp 2014-07-10
  • 打赏
  • 举报
回复
引用 6 楼 shine333 的回复:
用反射可以
  public static void main(String[] args) throws Exception {
    final String str = "abcd";
    System.out.println(str);
    edit(str, "efgh");
    System.out.println(str);
  }

  public static void edit(final String str, String newValue) throws Exception {
    Field field = String.class.getDeclaredField("value");
    field.setAccessible(true);
    field.set(str, newValue.toCharArray());
  }
不过反射这种方法有点“奇技淫巧”之感,彻底破坏代码严谨性。。 实际项目中除非万不得已只此一条路,不然要么被上司骂死,要么被后期维护人员群殴
PDD123 2014-07-10
  • 打赏
  • 举报
回复
明白了,感谢大家。 我的类中有一个String,修改的时候,直接就让他=另一个引用了,我就怕如果能修改,在我的程序中把其中一个对象的修改了,到时候另一个对象也发生变化。
疯癫行者 2014-07-10
  • 打赏
  • 举报
回复
引用 11 楼 whos2002110 的回复:
[quote=引用 6 楼 shine333 的回复:] 用反射可以
  public static void main(String[] args) throws Exception {
    final String str = "abcd";
    System.out.println(str);
    edit(str, "efgh");
    System.out.println(str);
  }

  public static void edit(final String str, String newValue) throws Exception {
    Field field = String.class.getDeclaredField("value");
    field.setAccessible(true);
    field.set(str, newValue.toCharArray());
  }
JDK7 以前不行吧, 测不了了, 好像是有个长度限制什么的[/quote] java 8 测试通过。
whos2002110 2014-07-10
  • 打赏
  • 举报
回复
引用 6 楼 shine333 的回复:
用反射可以
  public static void main(String[] args) throws Exception {
    final String str = "abcd";
    System.out.println(str);
    edit(str, "efgh");
    System.out.println(str);
  }

  public static void edit(final String str, String newValue) throws Exception {
    Field field = String.class.getDeclaredField("value");
    field.setAccessible(true);
    field.set(str, newValue.toCharArray());
  }
JDK7 以前不行吧, 测不了了, 好像是有个长度限制什么的
  • 打赏
  • 举报
回复
围观大神辩论
疯癫行者 2014-07-10
  • 打赏
  • 举报
回复
引用 8 楼 shine333 的回复:
[quote=引用 7 楼 stonefeng 的回复:] 这个你别想了,java里String的设计就是不能修改的,如果你想出修改的办法了,那你就厉害了,可以到oracle公司寻求一个Java大神职位。 而且为了防止修改String类的行为,把String设置成不能被继承的。
@see java.lang.reflect.AccessibleObject.setAccessible(boolean)[/quote] 也行吧,我刚才说的太绝对了,收回。但反射不算是正常方法。楼主主要是不知道String是被设计成不能改的。
shine333 2014-07-10
  • 打赏
  • 举报
回复
引用 7 楼 stonefeng 的回复:
这个你别想了,java里String的设计就是不能修改的,如果你想出修改的办法了,那你就厉害了,可以到oracle公司寻求一个Java大神职位。 而且为了防止修改String类的行为,把String设置成不能被继承的。
@see java.lang.reflect.AccessibleObject.setAccessible(boolean)
疯癫行者 2014-07-10
  • 打赏
  • 举报
回复
这个你别想了,java里String的设计就是不能修改的,如果你想出修改的办法了,那你就厉害了,可以到oracle公司寻求一个Java大神职位。 而且为了防止修改String类的行为,把String设置成不能被继承的。
shine333 2014-07-10
  • 打赏
  • 举报
回复
用反射可以
  public static void main(String[] args) throws Exception {
    final String str = "abcd";
    System.out.println(str);
    edit(str, "efgh");
    System.out.println(str);
  }

  public static void edit(final String str, String newValue) throws Exception {
    Field field = String.class.getDeclaredField("value");
    field.setAccessible(true);
    field.set(str, newValue.toCharArray());
  }
只是_曾经 2014-07-10
  • 打赏
  • 举报
回复
不能修改。
whos2002110 2014-07-10
  • 打赏
  • 举报
回复
不能修改是因为String类没有提供修改内部char[] value;的方法,而且你不能通过继承去扩展它的特征。
commanager 2014-07-10
  • 打赏
  • 举报
回复
String类是final,在java的定义中是不可变对象。
  • 打赏
  • 举报
回复
你要修改a对象,还是常量池里面的“abcd”啊? 这俩都能改,你要改a对象就从新new一个 你要修改常量池里的“abcd”就写个外挂,找到abcd的内存地址,修改掉!
PDD123 2014-07-10
  • 打赏
  • 举报
回复
我也找了一些资料,String对象创建出来之后就无法修改了?

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧