假设我创建了一个实现 Closable 的类 MyClass。所以在 close() 方法中,我将释放一些非常重要的资源。好吧,因为它是非常重要的资源,所以我创建了某种安全网络(如 Effective Java 中推荐的那样)。这里是:
protected void finalize(){
if (/*user didn't call close() method by himself*/){
close();
}
}
一开始我很高兴,但后来我读到终结器并不那么酷,而且有一个像 PhantomReference 这样很酷的工具。所以我决定更改我的代码以使用 PhantomReference 而不是 finalize() 方法。我创建了 CustomPantom 扩展了 PhantomRefernce。这里是:
public class CustomPhantom extends PhantomReference {
//Object cobj;
public CustomPhantom(Object referent, ReferenceQueue q) {
super(referent, q);
//this.cobj = referent; can't save the refference to my object in a class field,
// because it will become strongly rechable
//and PhantomReference won't be put to the reference queue
}
public void cleanup(){
//here I want to call close method from my object,
//but I don't have a reference to my object
}
}
因此,正如我所见,我可以获得对我的对象的引用的唯一方法是使用反射并从 Reference 类中的引用字段中获取 if。这是从清理方法调用 MyClass.close() 的唯一方法吗?
PS我没有在这里发布所有代码,但我测试了它并且一切正常。ReferenceQueue由PhantomReferences填充,然后我可以一一获取并调用清理方法。但是我看不到如何在不使用反射的情况下解决上述问题。