背景
在研究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查看字节码,省略常量池代码,结果如下:
看到字节码之后就能够一目了然了,匿名类会把参数转换成类的成员变量,并在构造函数中把值初始化。