[jboss-cvs] JBossAS SVN: r71775 - 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 8 01:24:27 EDT 2008
Author: flavia.rainone at jboss.com
Date: 2008-04-08 01:24:27 -0400 (Tue, 08 Apr 2008)
New Revision: 71775
Modified:
projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java
Log:
[JBAOP-550] Removed need to load classes and changed class loadeer storage to a weak hash map.
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-08 05:21:41 UTC (rev 71774)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java 2008-04-08 05:24:27 UTC (rev 71775)
@@ -21,6 +21,7 @@
*/
package org.jboss.aop.instrument;
+import java.lang.ref.WeakReference;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.security.AccessController;
@@ -33,6 +34,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.WeakHashMap;
import javassist.CannotCompileException;
import javassist.ClassPool;
@@ -133,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, GeneratedClassInfo>> generatedJoinPointClassCache =
- new HashMap<String, Map<ClassLoader, GeneratedClassInfo>>();
+ private HashMap<String, Map<ClassLoader, WeakReference<GeneratedClassInfo>>> generatedJoinPointClassCache =
+ new HashMap<String, Map<ClassLoader, WeakReference<GeneratedClassInfo>>>();
/**
* Constructor.
@@ -272,48 +274,34 @@
//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;
- Class<?> clazz = null;
- Map<ClassLoader, GeneratedClassInfo> generatedClasses = generatedJoinPointClassCache.get(infoAdviceString);
+ Map<ClassLoader, WeakReference<GeneratedClassInfo>> generatedClasses =
+ generatedJoinPointClassCache.get(infoAdviceString);
if (generatedClasses != null)
{
- generatedClass = generatedClasses.get(classloader);
- if (generatedClass != null)
- {
- try
- {
- clazz = classloader.loadClass(generatedClass.getGenerated().getName());
- }
- catch (ClassNotFoundException e)
- {
- // class loader did not found the class, so, we need to generate
- // the class again
- }
- }
+ generatedClass= generatedClasses.get(classloader).get();
}
else
{
- generatedClasses = new HashMap<ClassLoader, GeneratedClassInfo>();
+ generatedClasses = new WeakHashMap<ClassLoader, WeakReference<GeneratedClassInfo>>();
generatedJoinPointClassCache.put(infoAdviceString, generatedClasses);
}
- if (clazz == null)
+ if (generatedClass == null)
{
//We need to do all the work again
AspectManager manager = AspectManager.instance();
ClassPool pool = manager.findClassPool(classloader);
- generatedClass = generateJoinpointClass(pool, info);
-
ProtectionDomain pd = advisorClass.getProtectionDomain();
- clazz = toClass(pool, generatedClass.getGenerated(), pd);
- generatedClasses.put(classloader, generatedClass);
+ generatedClass = generateJoinpointClass(pool, info, classloader, pd);
+ generatedClasses.put(classloader, new WeakReference<GeneratedClassInfo>(generatedClass));
}
- Object obj = instantiateClass(clazz, generatedClass.getAroundSetups(), info);
+ Object obj = instantiateClass(generatedClass, info);
joinpointField.set(info.getAdvisor(), obj);
if (info.getAdvisor() instanceof InstanceAdvisor)
{
- Field field = clazz.getDeclaredField(IS_FOR_INSTANCE_ADVISOR);
+ Field field = generatedClass.getGenerated().getDeclaredField(IS_FOR_INSTANCE_ADVISOR);
SecurityActions.setAccessible(field);
field.set(obj, Boolean.TRUE);
}
@@ -339,13 +327,14 @@
}
}
- private Class<?> toClass(ClassPool pool, CtClass ctclass, ProtectionDomain pd) throws NotFoundException, CannotCompileException, ClassNotFoundException
+ private Class<?> toClass(ClassLoader classLoader, CtClass ctclass, ProtectionDomain pd) throws NotFoundException, CannotCompileException, ClassNotFoundException
{
- return TransformerCommon.toClass(ctclass, pd);
+ return TransformerCommon.toClass(ctclass, classLoader, pd);
}
- private Object instantiateClass(Class<?> clazz, AdviceSetup[] aroundSetups, JoinPointInfo info) throws Exception
+ private Object instantiateClass(GeneratedClassInfo generatedClass, JoinPointInfo info) throws Exception
{
+ Class<?> clazz = generatedClass.getGenerated();
Constructor<?> ctor = clazz.getConstructor(new Class[] {info.getClass()});
Object obj;
try
@@ -362,7 +351,7 @@
// }
throw new RuntimeException(debugClass(sb, clazz).toString(), e);
}
-
+ AdviceSetup[] aroundSetups = generatedClass.getAroundSetups();
for (int i = 0 ; i < aroundSetups.length ; i++)
{
if (aroundSetups[i].isNewCFlow())
@@ -412,7 +401,7 @@
protected abstract void initialiseJoinPointNames(JoinPointInfo info);
- private GeneratedClassInfo generateJoinpointClass(ClassPool pool, JoinPointInfo newInfo) throws NotFoundException,
+ private GeneratedClassInfo generateJoinpointClass(ClassPool pool, JoinPointInfo newInfo, ClassLoader classloader, ProtectionDomain pd) throws NotFoundException,
CannotCompileException, ClassNotFoundException
{
CtClass superClass = pool.get(joinpointFqn);
@@ -437,7 +426,8 @@
createInvokeNextMethod(clazz, isVoid(), setups, newInfo);
overrideDispatchMethods(superClass, clazz, newInfo);
- return new GeneratedClassInfo(clazz, setups);
+ Class<?> loadedClass= toClass(classloader, clazz, pd);
+ return new GeneratedClassInfo(loadedClass, setups);
}
catch (NotFoundException e)
{
@@ -1519,16 +1509,16 @@
private class GeneratedClassInfo
{
- CtClass generated;
+ Class generated;
AdviceSetup[] aroundSetups;
- GeneratedClassInfo(CtClass generated, AdviceSetups setups)
+ GeneratedClassInfo(Class generated, AdviceSetups setups)
{
this.generated = generated;
this.aroundSetups = setups.getByType(AdviceType.AROUND);
}
- CtClass getGenerated()
+ Class getGenerated()
{
return generated;
}
More information about the jboss-cvs-commits
mailing list