一、匿名类原理

背景

在研究spring源码的时候,看到下面一段代码:

addSingletonFactory(beanName, new ObjectFactory<Object>() {
    @Override
    public Object getObject() throws BeansException {
        //获取bean实例
        return getEarlyBeanReference(beanName, mbd, bean);
    }
});

因为这个ObjectFactory是存在Map中,以后再调用,而不是利用回调的方式,当时就在想匿名类没有成员变量,是如何把beanName这些参数给保存起来的?

分析

我写了下面代码分析:

public class AnonymousClassTest {
    interface ObjectFactory {
        void invoke();
    }
    public static void print(String str) {
        System.out.println(str);
    }
    public static void main(String[] args) {
        String str = "Hello World";
        ObjectFactory factory = new ObjectFactory() {
            @Override
            public void invoke() {
                print(str);
            }
        };
        factory.invoke();
    }
}

然后用java -v查看字节码,省略常量池代码,结果如下:


image.png

看到字节码之后就能够一目了然了,匿名类会把参数转换成类的成员变量,并在构造函数中把值初始化。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,149评论 0 62
  • 一、master选举 多个服务采用争抢注册临时节点,如果注册成功那么就是master。每个服务还要注册自己的服务信...
    16325阅读 188评论 0 0
  • 今天,是元旦节,新的一年又来了,我们又长大了一岁,就应该更加努力的去听爸爸妈妈的话。 我想,大家应该都知道今年...
    爱的结晶阅读 183评论 2 1
  • 在知乎上,经常看到有人请教关于辞职和换工作地的问题: “一份不开心但收入可观的工作值得坚持吗?”“我已经离职快1个...
    龙之语007阅读 239评论 0 1