/* * Copyright 2005 NAKAMURA Minoru (nminoru@nminoru.jp) */ package jp.nminoru.ref; import java.lang.ref.*; import java.lang.reflect.Field; public final class CleanupReference extends PhantomReference { private static Field referentField ; private static ReferenceQueue queue = new ReferenceQueue(); static { Class klass = java.lang.ref.Reference.class; try { referentField = klass.getDeclaredField("referent"); referentField.setAccessible(true); } catch(NoSuchFieldException e){ System.exit(1); } Thread handler = new ReferenceHandler(); handler.setPriority(Thread.MAX_PRIORITY); handler.setDaemon(true); handler.start(); } private static class ReferenceHandler extends Thread { public void run() { try { for (;;) { Reference r; CleanupReference reference = (CleanupReference)queue.remove(); Object target = reference.get(); if (target != null) { Cleaner cleaner = reference.cleaner; cleaner.clean(target); reference.clear(); } } } catch(InterruptedException e) { } } } Cleaner cleaner; public CleanupReference(Object referent, Cleaner cleaner) { super(referent, queue); this.cleaner = cleaner; } public Object get() { try { return referentField.get(this); } catch(IllegalAccessException e){ System.err.println(e); } return null; } }