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

昆明网站开发公司电话网页设计与网站建设考试名词解释2019

昆明网站开发公司电话,网页设计与网站建设考试名词解释2019,网站商城建站,为什么登录不上建设银行网站转载自 朝花夕拾——Java的synthetic修饰词Ok#xff0c;目前为止#xff0c;我还只是Android coder#xff0c;一切对其他的学习都是以Android 为主线的支线任务。所以为什么会提到这个方法呢#xff1f;是来自于google官方的性能建议文档的这样一句话#xff1a;Consid…转载自  朝花夕拾——Java的synthetic修饰词Ok目前为止我还只是Android coder一切对其他的学习都是以Android 为主线的支线任务。所以为什么会提到这个方法呢是来自于google官方的性能建议文档的这样一句话 Consider Package Instead of Private Access with Private Inner Classes 考虑包内访问来取代访问私有内部类的私有修饰的方法或变量为什么呢下文的回答是因为使用私有的内部类会产生静态的合成方法影响性能。1. synthetic方法 如果有看过我的EventBus源码讲解的同学会发现以下的一个常量 。 private static final int MODIFIERS_IGNORE Modifier.ABSTRACT | Modifier.STATIC | BRIDGE | SYNTHETIC;/*** 省略内容**/ //判断是否为PUBLICMODIFIERS_IGNORE 包含抽象静态桥接,合成,后2者是编译器添加的 if ((modifiers Modifier.PUBLIC) ! 0 (modifiers MODIFIERS_IGNORE) 0) 可以看到我在其上的注释 MODIFIERS_IGNORE 包含抽象静态桥接,合成,后2者是编译器添加的 我的注释写的没有错后面两种方法是编译器添加的。在此我给大家来一个小demo让看看合成方法是在怎么生成的 public class OutClass {private static class InnerClass {public InnerClass(){}private int x;private void y() {};}public static void main(String[] args) {InnerClass inner new InnerClass(); inner.x 2;System.out.println(inner.x);inner.y();for (Method m : InnerClass.class.getDeclaredMethods()) {System.out.println(String.format(%08X, m.getModifiers()) m.getName());}} 简单的一个静态内部类实列化之后通过反射遍历其所有方法。输出方法名的同时也将所有方法修饰词的十六进制码的格式输出。 运行结果如下先不看前面的十六进制码我们看看后面输出的方法名看上面的代码我们知道我们只写了一个名为 y 的方法。那么前面的两个access$123 是哪里来鬼怪 为了解开谜底我们再继续看看 java.lang.reflect.Modifier 里的几个修饰词的十六进制码 00001008 SYNTHETIC|STATIC 00000002 PRIVATE 00000111 NATIVE|FINAL|PUBLIC 00000011 FINAL|PUBLIC 00000001 PUBLIC 00001000 SYNTHETIC 00000008 STATIC 我们看到了 00001008 SYNTHETIC|STATIC 合成的静态方法修饰词。 所以access$1什么的都是我们编译器合成的方法且是静态的。然后问题来了 为什么呢ಠ౪ಠ 为什么生成这些方法平时我反射其他没有内部类的class的时候没有出现过的啊…. 真相 JVM是如何处理这个的class的它可不知道什么是内部类或者嵌套类的。JVM对所有的类都一视同仁它都认为是顶级类。被Javac编译后所有类都会被编译成顶级类而那些内部类编译完后会生成…$… class的类文件。注意是所有的内部类我写静态内部类是因为这样的demo简单所以如果你创建一个内部类的话它会被彻底编译成一个顶级类。原来JVM也是也挺笨的…..。 既然同时身为顶级类你OutClass 为什么可以直接调用我的InnerClass的私有方法和私有属性你算老几 为了解决这种矛盾我们的圣母玛丽亚式的Javac编译的时候想到了一个解决冲突办法在从中做了点手脚在InnerClass里为所有私有方法和私有变量又写了一个合成的静态方法。为了还原真相我写了这样的代码 private static class InnerClass {public InnerClass(){}private int x;synthetic static void access$1(int x) { this.xx; }synthetic static int access$2(int x) { return x }private void y() {};synthetic static int access$3() { y() }} 所有说等于是为了获取我们的x写了getter/setter方法。为了调用 y写了一个嵌套的调用方法…. 真是用心良苦啊….. 看完了上文我们知道了原来内部类在编译的时候为了给外部类调用提供了几个静态方法给外部类使用。补充点很重要啊 1. 如果将y方法的修饰词改为public就不会出现access$3()合成方法对x也是同理。 2.当你对x只赋值不调用时或者只调用不赋值。只会产生相应的getter或setter方法 3.将构造函数变为private 也会生成一个非静态的合成方法如下 synthetic void OutClass$InnerClass(OuClass this$0) { } 等下…this$0 这个又是什么鬼 别急…我先下文介绍2. synthetic对象 作为一个Android Coder 有一点我们都知道 内部类会持有外部类的指针有可能发生内存泄漏。所以我们常常建议在合适的时候将内部类改为静态内部类这样就可以不持有外部的指针。可是Do you know the reasons ? 我们还是上文的Class不过将其简单的改造下不过是将其输出隔离出来 public class OutClass {class InnerClass {public int x;public InnerClass() {}public void y() {};} } public class Demo {/*** param args*/public static void main(String[] args) {//遍历所有字段for (Field c : OutClass.InnerClass.class.getDeclaredFields()) {System.out.println(String.format(%08X, c.getModifiers()) c.getName());}System.out.println(-----------------------------------------);//遍历构造函数 for( Constructor? c : OutClass.InnerClass.class.getDeclaredConstructors() ){System.out.println(String.format(%08X, c.getModifiers()) c.getName() );//遍历构造函数入参for(Class temp:c.getParameterTypes()){System.out.println(temp.getSimpleName());}}} } 运行~以下为结果~我们可以看到我们内部的字段有两个一个是x 一个是 this$0 。而我们的构造函数只有一个没错可是却偷偷的传入了一个OutClass对象。 (/ _ )/~┴┴ 在javac 的编译之下…被改的东西还真多啊….为了让大家更直观。我再模拟下编译后的class 文件内的情况。 public class OutClass {class InnerClass {public int x;synthetic OutClass this$0;public InnerClass(OutClass args) {this.this$0 args;}public void y() {};} } 这样就明白了吧~我们的内部类之所以可以被外部类调用。原来是传了一个外部类的一个对象有了this$0我们可以随意的调用外部类的方法。 看完了上文我们知道了原来内部类在编译的时候为了调用外部类的方法在其构造函数里传入了一个外部类的对象。 再接下上文Android中为什么要将内部类改为静态内部类。是因为静态内部类是共享给当前类的所有对象的所以不需要传入当前类的引用。补充点很重要啊 1.如果内部类没有构造函数就能避免传参么NO!  即使是默认的构造函数也会传外部类引用。 000000不在修饰词内可以当作没有修饰词的构造方法。总结 归根结底作为一个Android的coder。那么多的static方法不适合移动的不算充裕的内存。因此Google不提倡使用私有内部类最好将其拆开独立成一个Class。还有内部类尽量改为静态内部类可以避免内存泄漏。有空看看google 的性能建议文档还是挺不错的XD~~
http://www.sadfv.cn/news/268469/

相关文章:

  • 无锡建设信息中心网站wordpress 收邮件
  • 东莞做外贸网站公司钢结构
  • 手机网站 分享按钮甘肃张掖网站建设
  • 南通北京网站建设东圃做网站的公司
  • 一个网站可以做多少弹窗广告抖音推广怎么做
  • 建设家装网站企业网站策划过程
  • 建设企业网站体会wordpress文章页面没有格式调整
  • 做推送的网站室内设计者联盟网
  • 大连网站建站wordpress如何连接图册
  • 做网站1500全包哈尔滨模板建站品牌
  • 长沙口碑好网站建设企业策划书模板免费下载的网站
  • 网站tag 怎么实现十大免费cad制图软件
  • 陕西手机网站建设陕西恒业建设集团网站
  • 广州h5网站编程开发
  • 素质课网站设计与建设seo关键词查询排名软件
  • 网站虚假备案wordpress树形主题
  • 吉安建设工程项目网站今天最新新闻
  • 古风网站建设广州vi设计公司
  • 《网站建设 补充合同陕西省建设网三类人员证书查询系统
  • 学校内部网站开发价格做网站499
  • 网站设计的初衷4G访问wordpress
  • 一建 建设网站首页做网站为何要续费
  • 网站开发技术 创新点网站上添加百度地图导航
  • 梅江区住房和城乡建设局官方网站电商培训班
  • 常州设计网站自助建站最好的平台
  • 电子商务网站建设的核心多选怎么做婚庆网站平台
  • 企业网站优化官网神农架网站设计
  • 怎么样才能做好网站建设wordpress无觅
  • 网站开发 网页上传 网页制作外链兔
  • 大学做网站有哪些最有效的网站推广公司