gpt4 book ai didi

java - 允许在别处引用匿名内部类实例时对类进行垃圾回收?

转载 作者:搜寻专家 更新时间:2023-11-01 02:18:19 27 4
gpt4 key购买 nike

我有一个 A 类:

public class A {
private B b = new B() { public void method() { do something } };

public B getB() { return b; }
}

public interface B { void method(); }

实例 b 有一个对其外部类实例的隐式引用(可以被 this 引用)。现在,另一个对象通过 getter 方法获得对此 b 的引用。由于引用,此 b 无法被垃圾回收。

有没有办法允许对封闭的 A 实例进行垃圾回收,也许是通过重置匿名内部类中的显式引用?

最佳答案

技术上可行:

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 平台没有准确定义内部类型如何引用外部类型。也就是说,它是一个编译器实现细节,并且在该字段中使用中间包装器是合法的,即使是愚蠢的——在存在其他字段的情况下,消除引用的歧义可能是不可能的。

简而言之,我绝不会这样做

如果这是一个问题,使用私有(private)静态内部类:

public class A {
private static class BImpl implements B {
@Override public void method() {
}
}

private final B b = new BImpl();

public B getB() { return b; }
}

关于java - 允许在别处引用匿名内部类实例时对类进行垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2056205/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com