I tried to simulate the situation described with this simple example: the classes in filesystem are: DynamicAOP/bin/AspectCreator.class DynamicAOP/bin/AspectCreator$MyThread.class DynamicAOP/bin/Caller.class
DynamicAOP/SimpleAspect.class The classpath points to DynamicAOP/bin/ so that SimpleAspect is out of the classpath scope. ///////// SimpleAspect //////////////////////////// @Aspect public class SimpleAspect { @Bind (pointcut="execution(public void AspectCreator->setCond())") public Object invoke(Invocation invocation) throws Throwable { System.out.println("<<< Entering Simplenterceptor for: " + invocation.getClass().getName()); return invocation.invokeNext(); } } ///////////////////////////////////////////////////////////// /////////////////// Caller ////////////////////////////// @Prepare("all(this)") public class Caller { private AspectCreator ac; public Caller() { System.out.println("Caller new instance"); ac = new AspectCreator(); } public void method1() { System.out.println("Caller.method1()"); } public void method2() { System.out.println("Caller.method2()"); } public void run() throws Exception { while(true) { method1(); method2(); java.util.concurrent.TimeUnit.MILLISECONDS.sleep(4000); ac.setCond(); java.util.concurrent.TimeUnit.MILLISECONDS.sleep(4000); method1(); method2(); } } public static void main(String[] args) throws Exception { Caller caller = new Caller(); caller.run(); } } ///////////////// Caller //////////////////////////////////////////////////////////////////////////////// ///////////// AspectCreator /////////////////////////////////////////////////////////////////// @Prepare ("all(this)") public class AspectCreator { private MyThread thread; private Boolean cond; public AspectCreator() { cond = false; thread = new MyThread(); thread.start(); } public void setCond() { synchronized (cond) { cond = true; } } public boolean getCond() { synchronized (cond) { return cond; } } public void injectAspect() throws Exception { System.out.println("Injecting aspect"); ClassLoader oldCl = Thread.currentThread().getContextClassLoader(); URLClassLoader ucl = null; ucl = new URLClassLoader(new URL[] {new File("/home/lele/java/eclipse_ws/DynamicAOP/").toURI().toURL()}, oldCl); AspectManager manager = AspectManager.instance(ucl); AspectAnnotationLoader loader = new AspectAnnotationLoader(manager); loader.setClassLoader(ucl); // ucl.loadClass("SimpleAspect"); InputStream in = null; in = new DataInputStream(new FileInputStream("/home/lele/java/eclipse_ws/DynamicAOP/SimpleAspect.class")); List list = new ArrayList(); list.add(in); Iterator iterator = list.iterator(); loader.deployInputStreamIterator(iterator); System.out.println("Aspect injected"); } class MyThread extends Thread { public void run() { while(true) { try { java.util.concurrent.TimeUnit.MILLISECONDS.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Checking condition..."); boolean value = getCond(); if (value) { try { injectAspect(); } catch (Exception e) { e.printStackTrace(); } } synchronized (cond) { cond = false; } } } } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// And the output is: $ ./run-loadHotSwap.sh /home/lele/java/eclipse_ws/DynamicAOP/bin/ -aopclasspath /home/lele/java/eclipse_ws/DynamicAOP/bin/ Caller Caller new instance Caller.method1() Caller.method2() Checking condition... Checking condition... Checking condition... Checking condition... Injecting aspect java.lang.NullPointerException at org.jboss.aop.pointcut.MethodMatcher.(MethodMatcher.java:72) at org.jboss.aop.pointcut.ExecutionMethodMatcher.(ExecutionMethodMatcher.java:53) at org.jboss.aop.pointcut.PointcutExpression.matchesExecution(PointcutExpression.java:118) at org.jboss.aop.Advisor.resolveMethodPointcut(Advisor.java:1333) at org.jboss.aop.GeneratedClassAdvisor.resolveMethodPointcut(GeneratedClassAdvisor.java:309) at org.jboss.aop.ClassAdvisor.resolvePointcuts(ClassAdvisor.java:751) at org.jboss.aop.ClassAdvisor.doRebuildInterceptorsForAddedBinding(ClassAdvisor.java:1160) at org.jboss.aop.ClassAdvisor$RebuildInterceptorsAction$2.rebuildInterceptorsForAddedBinding(ClassAdvisor.java:2348) at org.jboss.aop.ClassAdvisor.rebuildInterceptorsForAddedBinding(ClassAdvisor.java:1139) at org.jboss.aop.GeneratedClassAdvisor.access$1501(GeneratedClassAdvisor.java:65) at org.jboss.aop.GeneratedClassAdvisor$ClassAdvisorStrategy.rebuildInterceptorsForAddedBinding(GeneratedClassAdvisor.java:1538) at org.jboss.aop.GeneratedClassAdvisor.rebuildInterceptorsForAddedBinding(GeneratedClassAdvisor.java:244) at org.jboss.aop.Advisor.newBindingAdded(Advisor.java:1124) at org.jboss.aop.AspectManager.updateAdvisorsForAddedBinding(AspectManager.java:1498) at org.jboss.aop.AspectManager.updateAdvisorsForAddedBinding(AspectManager.java:1521) at org.jboss.aop.AspectManager.addBinding(AspectManager.java:1456) at org.jboss.aop.AspectManagerAnnotationLoaderStrategy.deployAspectMethodBinding(AspectManagerAnnotationLoaderStrategy.java:102) at org.jboss.aop.AspectAnnotationLoader.deployAspectMethodBindings(AspectAnnotationLoader.java:422) at org.jboss.aop.AspectAnnotationLoader.deployAspect(AspectAnnotationLoader.java:213) at org.jboss.aop.AspectAnnotationLoader.deployClassFile(AspectAnnotationLoader.java:125) at org.jboss.aop.AspectAnnotationLoader.deployInputStreamIterator(AspectAnnotationLoader.java:115) at AspectCreator.injectAspect(AspectCreator.java:59) at AspectCreator$MyThread.run(AspectCreator.java:76) Checking condition... Checking condition... ..... I can't figure out why this exception is thrown! Thanks for the help, Emanuele View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4184320#4184320 Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4184320 _______________________________________________ jboss-user mailing list jboss-user@lists.jboss.org https://lists.jboss.org/mailman/listinfo/jboss-user