内部类与外部类的私有字段和私有方法的相互访问

发布时间:2021-12-05 22:42:40

??最*学了下aop,并利用asm进行了实践,开发了一个Android的插件(https://github.com/zhoujucheng/bladeaop),使用这个插件的时候发现了一些我不认识的方法,研究了下发现是编译器生成的方法,目的是是解决内部类与外部类的私有字段和私有方法的相互访问的问题。
??首先需要知道是内部类是会被编译成一个单独的class文件,从这个角度看的话内部类和普通的类是区别并不大,然而这样的话,外部类是如何能访问到内部类的私有字段和私有方法呢?或者反过来说内部类是如何能访问到外部类的私有字段和私有方法呢?


public class OuterClass {

private InnerClass innerClass = new InnerClass();

public void test(){
System.out.println(innerClass.innerString);
}

private class InnerClass{
private String innerString = "Hello world!";
}
}


可以看到,InnerClass被编译成了OuterClass$InnerClass.class。通过javap -c OuterClass$InnerClass.class得到:


class OuterClass$InnerClass {
final OuterClass this$0;

OuterClass$InnerClass(OuterClass);
Code:
0: aload_0
1: aload_1
2: putfield #2 // Field this$0:LOuterClass;
5: aload_0
6: invokespecial #3 // Method java/lang/Object."":()V
9: aload_0
10: ldc #4 // String Hello world!
12: putfield #1 // Field innerString:Ljava/lang/String;
15: return

static java.lang.String access$000(OuterClass$InnerClass);
Code:
0: aload_0
1: getfield #1 // Field innerString:Ljava/lang/String;
4: areturn
}

??从反编译得到的字节码可以看出,多了一个access$000方法,而且是一个static,参数为OuterClass$InnerClass对象,看到这样总算明白了,编译器为我们生成了static方法,然后通过传入内部类的对象访问私有字段和方法。这个内部类像下面这样:


class OuterClass$InnerClass {
private String innerString = "Hello world!";
static String access$000(OuterClass$InnerClass innerClass){
return innerClass.innerString;
}
}

??其实内部类访问外部类的私有字段和方法用的也是同一个套路,首先编译器会为内部类生成一个带有外部类参数的构造器,上面的字节码也已经体现出来了,从上面的字节码可以看出,外部类的对象引用会被保存到了内部类的this$0里,当内部类访问外部类的私有字段或方法时,实际上会调用外部类的由编译器生成的static方法,并将内部类的this$0传过去,然后外部类的static方法利用这个参数达到访问私有字段和方法的目的。

相关文档

  • 2017绵阳重点高中排名
  • 手机没网可以用支付宝支付吗 没网络怎么用支付宝付款 使用方法步骤
  • 给女友早安关心问候语
  • 关于快乐阅读的手抄报
  • 荣耀9换屏幕总成教程
  • 一路与同行作文
  • 初二第一学期语文教学工作总结范文
  • 做诚实守信的好少年国旗下讲话_做诚实守信的好少年国旗下讲话稿
  • BTC技术深度回调之后的盘整
  • 教师先进个人事迹材料精选
  • 笔筒的收藏价值
  • 孝亲敬老孝道日记500字
  • 【转】以太网数据帧(802.3)最大与最小长度
  • 关于快过年的说说有哪些
  • 大学课程设计心得体会2020
  • 丸美哪款眼霜好用 好用的丸美眼霜推荐
  • 体寒者不能吃的水果有哪些?什么水果体寒者可以吃?
  • 读书小报手抄报高清图片
  • 长虹空调j1是什么故障
  • 发生交通事故之后要怎么办
  • 我对当下公有云的一些粗浅认识
  • 命名数据网络(NDN)中的数据安全隐患
  • 微信6.3.1更新不了/无法安装怎么办 解决方法介绍
  • 桃花盛开的因特网
  • 訾博 2021年1月23日 周六 阴 闲谈我的读书与写作
  • 初三第二学期学习计划
  • 好用的远程登录服务器工具
  • 凄怆签名
  • 怎么把宠物删除
  • qq扩列为什么不可以匹配
  • 猜你喜欢

  • 【推荐】新兴小学2017年人教版四年级上册数学期中试卷
  • 中小企业的发展瓶颈与竞争力提升讲义
  • 行风评议承诺书范文
  • 愚人节用信息整同学的方法
  • Linux中目录与文件的权限意义
  • 卡通猴子的简笔画图片
  • 污泥脱水机房操作细则
  • 手机打不了电话怎么办
  • 海岛微网的主从控制策略研究
  • 中西医结合治疗桡骨远端粉碎性骨折56例临床观察
  • 家常小菜大赏:五花肉配鱿鱼,不一样的美味推荐
  • 《雷锋日记》读后感_小学四年级作文200字
  • 二年级作文200字:我们的课余生活
  • 广西中科点击大数据科技有限公司(企业信用报告)- 天眼查
  • 军训总结主题班会的演讲稿_策划书.doc
  • 随车工具项目可行性研究报告申请报告
  • 《心理测量》实验报告
  • 2018新苏教版国标本二年级下册语文《鸟岛》第二课时教学设计
  • 新安县富凯工贸有限公司企业信用报告-天眼查
  • *面汇交力系教案
  • 车辆个人租赁合同范本
  • 液压机操作安全规程
  • python字符串模糊匹配_python匹配字符
  • 【精品】201X入党申请书规范版本-word格式 (2页)
  • 新型玻璃_五年级作文_2
  • 内蒙古嘉腾文化传媒有限公司企业信息报告-天眼查
  • vector 类中的 push_back( ) 函数
  • 第三章 国际物流与国际贸易
  • WindowManager.LayoutParams学习笔记
  • 程序设计精品课程在线考试系统
  • 2019年北师大版一年级语文下册第三单元提升练*题及答案
  • 新课程高考北京考试大纲世界史(表格版)
  • 男人出轨后为什么不碰老婆男人不碰老婆的心理
  • 精品八年级语文上册第四单元17蓝蓝的威尼斯备课资料素材苏教
  • 讲政治、严纪律、强作风、促提升”心得体会
  • 芭比娃娃_小学五年级作文500字
  • 中学生英语日记:我有一个梦想
  • XX街道办党风廉政建设工作总结分析
  • 《激战》主副职业巧搭配
  • 2011届高三历史上册期末模块考试试卷2
  • 油浸式电力变压器绝缘故障分析
  • 营养与保健第一章 绪论 PP课件
  • 电脑版