Browse Source

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
master
Steve Loughran 22 years ago
parent
commit
e5a85d7265
2 changed files with 77 additions and 28 deletions
  1. +39
    -28
      src/main/org/apache/tools/ant/util/WeakishReference.java
  2. +38
    -0
      src/main/org/apache/tools/ant/util/WeakishReference12.java

+ 39
- 28
src/main/org/apache/tools/ant/util/WeakishReference.java View File

@@ -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();
}
}
}

+ 38
- 0
src/main/org/apache/tools/ant/util/WeakishReference12.java View File

@@ -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();
}

}

Loading…
Cancel
Save