Когда анонимный класс, не имеющий ссылки на его класс включения, возвращается из метода экземпляра, он имеет ссылку на this
. Почему?
Рассмотрим следующий код:
package so;
import java.lang.reflect.Field;
public class SOExample {
private static Object getAnonymousClassFromStaticContext() {
return new Object() {
};
}
private Object getAnonymousClassFromInstanceContext() {
return new Object() {
};
}
public static void main(String[] args) throws NoSuchFieldException, SecurityException {
Object anonymousClassFromStaticContext = getAnonymousClassFromStaticContext();
Object anonymousClassFromInstanceContext = new SOExample().getAnonymousClassFromInstanceContext();
Field[] fieldsFromAnonymousClassFromStaticContext = anonymousClassFromStaticContext.getClass().getDeclaredFields();
Field[] fieldsFromAnonymousClassFromInstanceContext = anonymousClassFromInstanceContext.getClass().getDeclaredFields();
System.out.println("Number of fields static context: " + fieldsFromAnonymousClassFromStaticContext.length);
System.out.println("Number of fields instance context: " + fieldsFromAnonymousClassFromInstanceContext.length);
System.out.println("Field from instance context: " + fieldsFromAnonymousClassFromInstanceContext[0]);
}
}
Это вывод:
Number of fields static context: 0
Number of fields instance context: 1
Field from instance context: final so.SOExample so.SOExample$2.this$0
Каждый метод, хотя, по-видимому, вызывает тот же код, делает что-то другое. Мне кажется, что метод экземпляра возвращает вложенный класс, тогда как статический метод возвращает статический вложенный класс (как статический член, он, очевидно, не может иметь ссылку на this
).
Учитывая тот факт, что нет ссылки на охватывающий класс, я не вижу преимущества в этом.
Что происходит за кулисами?