当前位置: 首页 > news >正文

镇江网站开发庆阳西峰

镇江网站开发,庆阳西峰,html所有标签大全,聊天软件开发需要多少钱当final修饰一个数据域时#xff0c;意义是声明该数据域是最终的#xff0c;不可修改的。常见的使用场景就是eclipse自动生成的serialVersionUID一般都是final的。 另外还可以构造线程安全#xff08;thread safe#xff09;的immutable类#xff0c;比如String#xff0… 当final修饰一个数据域时意义是声明该数据域是最终的不可修改的。常见的使用场景就是eclipse自动生成的serialVersionUID一般都是final的。 另外还可以构造线程安全thread safe的immutable类比如String其数据域都是final的。这些使用场景都建立在final不可修改这个条件上但是反射可以打破这一切。 1.利用反射修改final数据域 首先构造一个Person类里面有个final字段NAME。我们尝试着修改这个字段。顺利的出乎意料。 public class Person {public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {Person p new Person();Field field p.getClass().getDeclaredField(NAME);field.setAccessible(true);field.set(p,Hello);System.out.println(field.get(p));//p.printName();}private final String NAME Clive;public Person() {}public void printName() {System.out.println(NAME);} } /*************** console print: Hello ***************/ 2.内联与内联消除 NAME数据域如此简单的就被修改了final真是太不安全了 但是当我们调用p.printName() 时控制台打印的却是Clive字符串。这是因为JVM做了优化处理 当一个数据域被final修饰,那就表明这个数据域是常量JVM会把所有NAME数据域出现的地方全部用Clive替换掉 比如 printName() 方法其实被优化成了这样。 public void printName() { System.out.println(Clive); } 所以要想不被自动优化就要把代码弄得复杂点如下 public class Person {public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {Person p new Person();Field field p.getClass().getDeclaredField(NAME);field.setAccessible(true);field.set(p,Hello);System.out.println(field.get(p));p.printName();}private final String NAME (null!null?Clive:Clive); //声明时即初始化public Person() {//或者在这里设置NAME数据域的值//NAMEClive;}public void printName() {System.out.println(NAME);} } /*************** console print: Hello Hello ***************/ 结果见 console print,顺利消除了优化,final字段最终被修改了! 3.修改static final数据域 如果在NAME字段再增加一个static关键字修饰然后再用反射修改的话就不行了 会抛出异常 java.lang.IllegalAccessException: Can not set static final int field ... 这时修改Field中的modifiers数据域清除代表final的那个bit才可以成功修改。 public class Person {public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {Person p new Person();Field field p.getClass().getDeclaredField(NAME);Field modifiers field.getClass().getDeclaredField(modifiers);modifiers.setAccessible(true);modifiers.setInt(field, field.getModifiers() ~Modifier.FINAL);//fianl标志位置0field.set(p,Hello);System.out.println(field.get(p));p.printName();}private final String NAME (null!null?Clive:Clive);public Person() {}public void printName() {System.out.println(NAME);} } /************** console print: Hello Hello **************/ 总结 这个知识点感觉知道就好平时还是不要修改final数据域的好 :) 引用 1.https://www.oschina.net/question/1245392_159103 2.https://github.com/jOOQ/jOOR 转载于:https://www.cnblogs.com/fudashi/p/6624379.html
http://www.pierceye.com/news/166485/

相关文章:

  • 企业做网站找谁有什么建筑网站
  • 自己做的网站显示iis7游戏网站怎么建设
  • 淘宝联盟怎么做自已的网站什么叫利用网站做蜘蛛池
  • 做网站要多少带宽镇江网站建设联系思创
  • 唐朝网站的地址软件设计师报考条件
  • seo网站建设刘贺稳营销专家a西宁市网站建设多少钱
  • 上海哪家公司做网站最好网站建设服务合同 付款方式
  • 做网站需要源码吗软件代理商招募
  • 陕西省西安市制作网站上海云建站模板
  • wordpress注册审批汕头网站优化
  • 想招代理去什么网站做网站seo优化的公司
  • 网站制作是什么公司建设企业官方网站的流程
  • 深圳哪家网站建设公司好门户网站制作平台
  • 互联网网站模版工作室网站开发
  • 现在从事网站开发如何销售团队
  • 公司网站设计素材淘宝官网首页
  • 建设公司网站的目的seo推广软件下载
  • 排名好的成都网站建设十堰网络销售
  • 网站qq号获取网站运营与建设作业
  • 网站建设要经历哪些步骤建设银行官网学生交费网站
  • 如何注册网站平台怎么免费搭建一个网站
  • 淘宝客网站建设平台怎么获取网站数据做统计数据
  • 做网站找外包公司要要搞清楚什么抖音开放平台是干嘛的
  • 可以中英切换的网站怎么做四川住房建设厅官方网站
  • 网站制作网站设计优客工场 网站开发
  • 微网站建设开发用系统建购物网站
  • 小说网站建立浙江省和住房建设厅网站
  • 网站去掉后缀html代码运行框wordpress6
  • 做问卷的几个网站石家庄建站源码
  • 响应式网站的制作刷排名seo软件