Java Tutorial/Reflection/WeakReference

Материал из Java эксперт
Перейти к: навигация, поиск

A weak reference is used to determine when an object is no longer being referenced.

   <source lang="java">

import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; public class Main {

 public static void main(String[] argv) throws Exception {
   ReferenceQueue rq = new ReferenceQueue();
   WeakReference<String> wr = new WeakReference<String>("string", rq);
   while (true) {
     Reference r = rq.remove();
     if (r == wr) {
       System.out.println("no longer referenced");
     }
   }
 }

}</source>





Testing WeakReference

   <source lang="java">

import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; import java.util.HashMap; public class Main {

 public static void main(String[] args) {
   ReferenceQueue referenceQueue = new ReferenceQueue();
   Object object = new Object() {
     public String toString() {
       return "Referenced Object";
     }
   };
   Object data = new Object() {
     public String toString() {
       return "Data";
     }
   };
   HashMap map = new HashMap();
   Reference reference = null;
   System.out.println("Testing WeakReference.");
   reference = new WeakReference(object, referenceQueue);
   map.put(reference, data);
   System.out.println(reference.get());
   System.out.println(map.get(reference));
   System.out.println(reference.isEnqueued());
   System.gc();
   System.out.println(reference.get());
   System.out.println(map.get(reference));
   System.out.println(reference.isEnqueued());
   object = null;
   data = null;
   System.gc();
   System.out.println(reference.get());
   System.out.println(map.get(reference));
   System.out.println(reference.isEnqueued());
 }

}</source>