[分享] 改变 public static final String obj 的值的方法
这样的设计就是为了不改变obj的值。
但是,规则都是限制别人的。不想让别人改变,有时候自己却想改变。
不纠结为什么要改变它,如果你真的想改变,实验下这个
- Java code
/** * 重新设置String的值,不是将obj指向新的地址,而是直接修改obj.value的指向<br/> * <strong>警告</strong>:obj必须这样申明: String obj = new String();<br/> * 如果这样申明 String obj= "123"; * changeValue(obj,"abc"),将可能导致虚拟机中所有值为"123"的String变成"abc" * * @param obj * @param newValue * 新的值。 * @return obj */ public static String changeValue(String obj,String newValue) { char[] _value = newValue.toCharArray(); char[] charArray =Arrays.copyOf(_value, _value.length); Field field=null; try { field = String.class.getDeclaredField("value"); field.setAccessible(true); field.set(obj, charArray); field = String.class.getDeclaredField("offset"); field.setAccessible(true); field.set(obj, 0); field = String.class.getDeclaredField("count"); field.setAccessible(true); field.set(obj, charArray.length); field = String.class.getDeclaredField("hash"); field.setAccessible(true); field.set(obj, 0); }catch ( Exception e) { e.printStackTrace(); } return obj; }[解决办法]
这叫什么改变呢,只不过是进行了深拷贝而已吧
[解决办法]
违背了String是不可变类设计的初衷了!
想法确实很特别。。
[解决办法]
[解决办法]
我吐,这也被推荐了。
这样的设计就是为了不改变obj的值。
但是,规则都是限制别人的。不想让别人改变,有时候自己却想改变。
不纠结为什么要改变它,如果你真的想改变,实验下这个
你设计成get方法来获取该值,设计一个具有“访问权限”的set方法,o了。你上面的反射,你可以用,人家照样可用,说来说去就是一种垃圾设计。
[解决办法]
主要想表达的意思是,你可以使用反射感觉上好像可以限制,难道还能限制别人用反射么???
抱歉,激动啦。
[解决办法]
[解决办法]
呵呵,不错,但是没有很多的意义!
[解决办法]
- Java code
public interface LegendConstants { public static final String LEGEND_HOME = "legend.home"; public static final String LEGEND_I18N_ENCODING = "legend.i18n.encoding"; public static final String LEGEND_RESOURCE_ROOT = "legend.resource.root"; public static final String LEGEND_RESOURCE_PROVIDER_CLASSNAME = "legend.resource.provider.classname"; public static final String LEGEND_TEMPLATE_DIR = "legend.template.dir"; public static final String LEGEND_DEVMODE="legend.devMode"; public static final String LEGEND_THEME = "legend.theme"; public static final String LEGEND_ADMINISTRATOR = "legend.administrator";}
[解决办法]
赞一个,LZ想法确实不错,挑战String“不可变字符序列”
不错。。。
不过在具体项目中不适用。反正都能改,做成public的算了。。是不。。。
而且大量反射的效率也不高
想法很好,以后说不定可以借鉴一下。。。
[解决办法]
思路很不错!1!
[解决办法]
利用的反射,思路不错
[解决办法]
呵呵,挺好
[解决办法]
没看懂什么神器
[解决办法]
要改变的话何必使用 final 呢?
[解决办法]
要改变的话何必使用 final 呢?
[解决办法]
因为现在都把 suppressAccessChecks 权限放开给你了,如果服务器启动时加上安全管理配置的话,你这个就会抛出 SecurityException 异常了,呵呵。
[解决办法]
想法不错,不过那样把final去了就是了
[解决办法]
算是一不算漏洞的漏洞吧
[解决办法]
不懂