這在技術上是可行的:
public class HasInner {
public static interface Foo {}
private static <T> T release(T instance, Object ref) {
try {
Class<?> type = instance.getClass();
for (Field field : type.getFields()) {
if (!field.isAccessible()) {
field.setAccessible(true);
}
if (field.get(instance) == ref) {
field.set(instance, null);
}
}
} catch (IllegalAccessException e) {
throw new IllegalStateException(e);
}
return instance;
}
public Foo makeFoo() {
return release(new Foo() {}, this);
}
public static void main(String[] args) {
new HasInner().makeFoo();
}
}
匿名類的的javap檢查:
Compiled from "HasInner.java"
final class HasInner$1 extends java.lang.Object implements HasInner$
Foo{
final HasInner this$0;
HasInner$1(HasInner);
}
實現不依賴於字段名稱爲this$0
,我懷疑這是一個編譯器實現細節。
可能存在的問題:
- 安全管理器可以禁止反射代碼。
- 我不認爲認爲 Java平臺明確定義內部類型是如何引用外部的。也就是說,這是一個編譯器實現細節,如果在域中有一箇中間包裝器(如果存在其他領域的話)可能是合法的,但是消除歧義引用可能是不可能的。
總之,我會永遠不要這樣做。
如果這是一個問題,使用私有靜態內部類:
public class A {
private static class BImpl implements B {
@Override public void method() {
}
}
private final B b = new BImpl();
public B getB() { return b; }
}
添加此評論,以便我可以看到OP是否最終接受此黑客,無論您的意見如何:-)(並且不,如果您得到低投訴,這不是我的;雖然我希望你刪除答案) – kdgregory 2010-01-13 13:22:22
Thx爲答案。很明顯,靜態內部類是更好的選擇。 不,我永遠也不會使用這個選項。你可以添加一些'壞'標記... – boutta 2010-01-13 13:39:35
@kdgregory:我只想知道一種可能性,而不是使用它。是的,這個答案就是我正在尋找的。 – boutta 2010-01-13 13:42:24