From e5a85d7265ed5c9a0e391d5d00596368229e8014 Mon Sep 17 00:00:00 2001 From: Steve Loughran Date: Tue, 8 Oct 2002 05:45:35 +0000 Subject: [PATCH] This is the reflection based fixup for weak refs on 1.2+ git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@273412 13f79535-47bb-0310-9956-ffa450edef68 --- .../tools/ant/util/WeakishReference.java | 67 +++++++++++-------- .../tools/ant/util/WeakishReference12.java | 38 +++++++++++ 2 files changed, 77 insertions(+), 28 deletions(-) create mode 100644 src/main/org/apache/tools/ant/util/WeakishReference12.java diff --git a/src/main/org/apache/tools/ant/util/WeakishReference.java b/src/main/org/apache/tools/ant/util/WeakishReference.java index e12a7b9f6..b86c6acfe 100644 --- a/src/main/org/apache/tools/ant/util/WeakishReference.java +++ b/src/main/org/apache/tools/ant/util/WeakishReference.java @@ -54,7 +54,11 @@ package org.apache.tools.ant.util; -import java.lang.ref.WeakReference; +import org.apache.tools.ant.BuildException; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; + /** * this is a weak reference on java1.2 and up, a hard @@ -63,6 +67,9 @@ import java.lang.ref.WeakReference; */ public abstract class WeakishReference { + private static Constructor referenceConstructor; + + private final static String WEAK_REFERENCE_NAME= "org,apache.tools.ant.util.WeakishReference12"; /** * create the appropriate type of reference for the java version @@ -70,13 +77,40 @@ public abstract class WeakishReference { * @return */ public static WeakishReference createReference(Object object) { - if(JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)) { - return new HardReference(object); - } else { - return new SoftReference(object); + if(referenceConstructor==null) { + createReferenceConstructor(); + } + try { + return (WeakishReference)referenceConstructor + .newInstance(new Object[]{object}); + } catch (Exception e) { + throw new BuildException("while creating a weakish reference",e); + } + } + + /** + * create the appropriate constructor method for the + */ + private static void createReferenceConstructor() { + Class[] ctor=new Class[]{Object.class}; + try { + referenceConstructor=HardReference.class.getConstructor(ctor); + } catch (NoSuchMethodException e) { + //deep trouble here + throw new BuildException("when creating a Hard Reference constructor",e); + } + if (!JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)) { + //create a weak ref constructor. If this fails we have that hard one anyway + try { + Class clazz=Class.forName(WEAK_REFERENCE_NAME); + referenceConstructor=clazz.getConstructor(ctor); + } catch (ClassNotFoundException e) { + } catch (NoSuchMethodException e) { + } } } + /** * Returns this reference object's referent. If this reference object has * been cleared, then this method returns null. @@ -108,27 +142,4 @@ public abstract class WeakishReference { } } - /** - * a soft reference for Java 1.2 or later - */ - private static class SoftReference extends WeakishReference { - private WeakReference weakref; - - /** - * create a new soft reference, which is bound to a - * Weak reference inside - * @param reference - * @see java.lang.ref.WeakReference - */ - public SoftReference(Object reference) { - this.weakref = new WeakReference(reference); - } - - /** - * Returns this reference object's referent. - */ - public Object get() { - return weakref.get(); - } - } } diff --git a/src/main/org/apache/tools/ant/util/WeakishReference12.java b/src/main/org/apache/tools/ant/util/WeakishReference12.java new file mode 100644 index 000000000..50ae10b6f --- /dev/null +++ b/src/main/org/apache/tools/ant/util/WeakishReference12.java @@ -0,0 +1,38 @@ +/* + * User: slo + * Date: Sep 10, 2002 + * Time: 11:02:16 PM + * Status: Experimental (Do Not Distribute) + * + * (c) Copyright 2002, Hewlett-Packard Company, all rights reserved. + */ + +package org.apache.tools.ant.util; + +import java.lang.ref.WeakReference; + +/** + * + */ +public class WeakishReference12 extends WeakishReference { + + private WeakReference weakref; + + /** + * create a new soft reference, which is bound to a + * Weak reference inside + * @param reference + * @see java.lang.ref.WeakReference + */ + public WeakishReference12(Object reference) { + this.weakref = new WeakReference(reference); + } + + /** + * Returns this reference object's referent. + */ + public Object get() { + return weakref.get(); + } + +}