@@ -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 <code>null</code>.
@@ -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();
}
}
}