本文部分内容引用自this引用逃逸
补充说明
匿名类
this应用逃逸在这篇文章中已经说的比较清楚了,同时Java并发编程实践中举了例子,说明this逃逸:
package com.example.demo.test1;
public class ThisEscape {
interface Event {
}
interface EventListener {
void onEvent(Event event);
}
interface EventSource {
void registerListener(EventListener eventListener);
}
private void doSomething(Event event) {
}
public ThisEscape(EventSource eventSource) {
eventSource.registerListener(new EventListener() {
@Override
public void onEvent(Event event) {
doSomething(event);
}
});
}
}
编译这个文件后,会出现5个class文件,如下
其中ThisEscape$1.class就是匿名类,代码如下
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.example.demo.test1;
import com.example.demo.test1.ThisEscape.Event;
import com.example.demo.test1.ThisEscape.EventListener;
class ThisEscape$1 implements EventListener {
ThisEscape$1(ThisEscape var1) {
this.this$0 = var1;
}
public void onEvent(Event var1) {
ThisEscape.access$000(this.this$0, var1);
}
}
匿名类对外部类的访问就很轻松了。
this引用查看
ThisEscape.java编译后的代码如下,从中可以明显看出this引用
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.example.demo.test1;
public class ThisEscape {
private void doSomething(ThisEscape.Event var1) {
}
public ThisEscape(ThisEscape.EventSource var1) {
var1.registerListener(new ThisEscape.EventListener() {
public void onEvent(ThisEscape.Event var1) {
ThisEscape.this.doSomething(var1);
}
});
}
interface EventSource {
void registerListener(ThisEscape.EventListener var1);
}
interface EventListener {
void onEvent(ThisEscape.Event var1);
}
interface Event {
}
}