关于java代码中对类进行重定义的探究(即匿名内部类)。包含字段定义,方法重写,追加方法

写这篇博客的时候是在看java8实战,其中发现了一段代码,感觉很奇怪,之前虽然接触过方法的动态重写,但是没见过此种代码

大致长这样:

问题的关键不在于这是一个lambda表达式,而是后面大括号内直接追加代码,最后实现的效果跟你新建一个HashMap,然后在调用两次它的put方法外面看起来差不多,但是其实有很大区别,

在遇到此类代码时,我一眼想起来的是方法的动态重写,类似这样:

在这之前一直以为这种形式只能用于动态的重写方法。直到今天遇见了这个代码

开门见山,说下他的本质:

跟jdk的动态代理类似,在创建代理时,jdk会为你创建一个实现你所给的接口的.class,在这里同样的jdk也为你创建了一个类(也就是一个.class)文件,该类是你用来所实际创建对象的类的子类,也就是new后面的那个类的子类。因此这种写法的意义就是动态修改类的定义,而不仅仅是能够修改方法。为此我写了一段复杂版本的类的重写的代码,长这样

 

找到类路径下,发现jdk自动生成了一个类文件

 

使用IDEA或者其他IDE反编译能够直接查看其代码,发现他是这样写的:

 

可以看到,他将单独代码块的内容整合到了新生成的类的构造方法中,为什么是这样呢?

因为生成的类对用户而言是不可见的,而且他是一个子类,你不可能去重写原类的构造器,因为生成的是子类,你在代码块中的所写的代码都是针对子类的代码,你再重写原类的构造器逻辑上就不对,最起码你也应该写子类的构造器代码,但是此时子类代码还没构造出来,名字都不直到,如何重载构造器,对吧。而且重载构造器也是没有必要的。此外你所能访问的只是原类的内容,new的是子类,但调用子类构造器前会递归调用父类构造器,因此原先本应是代码块的内容整合到子类构造器中对原类而言不会发生this逃逸的现象。

谨以此记录!!!

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值