热修复技术之Java相关

Java相关

内部类

我们所知道的:

  • 非静态内部类持有外部类引用;静态内部类不持有外部类引用

编译:

内部类与外部类在编译期都是顶级类,此时看做两个不同的类。但是,因为编译期会给外部类或者内部类的private成员和方法生成access&**方法。以达到内部类可以访问外部类的私有成员,外部类一样可以访问内部类的私有成员。所以和普通的两个不同的类还是不一样的

匿名内部类

按道理,补丁热修复是允许增加类的。但是添加一个匿名内部类的话,还是会提示新增了方法,这是会引发错误的

增加/减少匿名内部类,实际上对于热部署是无解的。应该极力避免

如果必须加入,要插入外部类的末尾

静态成员

类加载时机

什么时候会尝试加载一个类呢

  1. new一个类的对象
  2. 调用类的静态方法
  3. 获取类的静态成员

clinit

clinit方法会在类加载后,进行类初始化的时候调用。热修复是不支持的修复的。只能冷启动生效

init

在类加载后,对类对象进行初始化的时候会调用类的构造方法,会调用到init方法,来对非静态成员和方法进行初始化。对热部署没有影响

所以在创建一个类的对象的时候,流程应该是:

  1. 加载类,
  2. 调用clinit进行静态初始化,
  3. 调用构造函数,
  4. 调用init进行非静态初始化
发布了127 篇原创文章 · 获赞 3 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u010513497/article/details/103180117
今日推荐