[jboss-cvs] JBossAS SVN: r72583 - projects/aop/trunk/aop/src/main/org/jboss/aop/instrument.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Tue Apr 22 14:19:11 EDT 2008
Author: flavia.rainone at jboss.com
Date: 2008-04-22 14:19:10 -0400 (Tue, 22 Apr 2008)
New Revision: 72583
Modified:
projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java
Log:
[JBAOP-562] The weak references to the GeneratedClassInfo objects have been replaced by common references, and the
generated class reference contained inside the GeneratedClassInfo has been replaced by a weak reference. Now, the
GeneratedClassInfo reloads the class if this reference has been gc'ed.
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java 2008-04-22 18:06:36 UTC (rev 72582)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java 2008-04-22 18:19:10 UTC (rev 72583)
@@ -135,8 +135,8 @@
* A cache of the generated joinpoint classes indexed by the interceptor chains for the info to
* avoid having to generate a new class on every single rebind
*/
- private HashMap<String, Map<ClassLoader, WeakReference<GeneratedClassInfo>>> generatedJoinPointClassCache =
- new HashMap<String, Map<ClassLoader, WeakReference<GeneratedClassInfo>>>();
+ private HashMap<String, Map<ClassLoader, GeneratedClassInfo>> generatedJoinPointClassCache =
+ new HashMap<String, Map<ClassLoader, GeneratedClassInfo>>();
/**
* Constructor.
@@ -225,7 +225,7 @@
System.out.println(sb.toString());
throw new RuntimeException(e);
- }
+ }
}
/**
@@ -274,19 +274,18 @@
//Attempt to get the cached information so we don't have to recreate the class every time we rebind the joinpoint
String infoAdviceString = info.getAdviceString();
GeneratedClassInfo generatedClass = null;
- Map<ClassLoader, WeakReference<GeneratedClassInfo>> generatedClasses =
+ Map<ClassLoader, GeneratedClassInfo> generatedClasses =
generatedJoinPointClassCache.get(infoAdviceString);
-
if (generatedClasses != null)
{
if (generatedClasses.containsKey(classloader))
{
- generatedClass= generatedClasses.get(classloader).get();
+ generatedClass= generatedClasses.get(classloader);
}
}
else
{
- generatedClasses = new WeakHashMap<ClassLoader, WeakReference<GeneratedClassInfo>>();
+ generatedClasses = new WeakHashMap<ClassLoader, GeneratedClassInfo>();
generatedJoinPointClassCache.put(infoAdviceString, generatedClasses);
}
@@ -297,14 +296,14 @@
ClassPool pool = manager.findClassPool(classloader);
ProtectionDomain pd = advisorClass.getProtectionDomain();
generatedClass = generateJoinpointClass(pool, info, classloader, pd);
- generatedClasses.put(classloader, new WeakReference<GeneratedClassInfo>(generatedClass));
+ generatedClasses.put(classloader, generatedClass);
}
- Object obj = instantiateClass(generatedClass, info);
+ Object obj = instantiateClass(generatedClass, info, classloader);
joinpointField.set(info.getAdvisor(), obj);
if (info.getAdvisor() instanceof InstanceAdvisor)
{
- Field field = generatedClass.getGenerated().getDeclaredField(IS_FOR_INSTANCE_ADVISOR);
+ Field field = generatedClass.getGenerated(classloader).getDeclaredField(IS_FOR_INSTANCE_ADVISOR);
SecurityActions.setAccessible(field);
field.set(obj, Boolean.TRUE);
}
@@ -335,9 +334,9 @@
return TransformerCommon.toClass(ctclass, classLoader, pd);
}
- private Object instantiateClass(GeneratedClassInfo generatedClass, JoinPointInfo info) throws Exception
+ private Object instantiateClass(GeneratedClassInfo generatedClass, JoinPointInfo info, ClassLoader classloader) throws Exception
{
- Class<?> clazz = generatedClass.getGenerated();
+ Class<?> clazz = generatedClass.getGenerated(classloader);
Constructor<?> ctor = clazz.getConstructor(new Class[] {info.getClass()});
Object obj;
try
@@ -1512,18 +1511,33 @@
private class GeneratedClassInfo
{
- Class generated;
+ WeakReference<Class<?>> generated;
+ String generatedName;
AdviceSetup[] aroundSetups;
GeneratedClassInfo(Class generated, AdviceSetups setups)
{
- this.generated = generated;
+ this.generated = new WeakReference<Class<?>>(generated);
+ this.generatedName = generated.getName();
this.aroundSetups = setups.getByType(AdviceType.AROUND);
}
- Class getGenerated()
+ Class<?> getGenerated(ClassLoader classloader)
{
- return generated;
+ Class<?> generatedClass = generated.get();
+ if (generatedClass == null)
+ {
+ try
+ {
+ generatedClass = classloader.loadClass(generatedName);
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new RuntimeException("Unexpected exception: " + e, e);
+ }
+ generated = new WeakReference<Class<?>>(generatedClass);
+ }
+ return generatedClass;
}
AdviceSetup[] getAroundSetups()
More information about the jboss-cvs-commits
mailing list