Le 05/04/2013 11:15, Alexander Kriegisch a écrit :
> Check out 
> http://www.eclipse.org/aspectj/doc/next/weaver-api/org/aspectj/weaver/loadtime/WeavingURLClassLoader.html.
>
> Here is a little old code snippet I found in one of my projects when I 
> implemented a plug-in concept in which I had the aspect code in my main 
> project, but wanted to advise plugin JARs which were loaded on demand. Feel 
> free to modify it according to your needs:
>
>       private void loadPlugin(String pluginJar, String pluginClassName) 
> throws Exception {
>               echo("Trying to load plugin JAR " + pluginJar);
>               ClassLoader loader = 
> Thread.currentThread().getContextClassLoader();
>               WeavingURLClassLoader weaver = new WeavingURLClassLoader(
>                       new URL[] { new File(pluginJar).toURI().toURL() },
>                       new URL[] { loader.getResource(".") },
>                       loader
>               );
>               Class<?> pluginClass = weaver.loadClass(pluginClassName);
>               Plugin plugin = (Plugin) pluginClass.newInstance();
>               plugin.init(this);
>               plugins.add(plugin);
>               echo("Successfully loaded and initialised plugin '" + 
> plugin.getName() + "'");
>       }
Hi, and thanks for the answer.

But i had already seen this code and it doesn't fits our needs
In fact:
- two annotated aspects are present in the project, but not in separate jars
- aspect can't dynamically added at runtime depending on user configuration
  (cache, log, time aspects).

I succeeded tweaking some portion of the code and using ugly introspective
code to bypass aspectj final or private modifier (aspectj uses a little bit of
defensive code).

The code currently looks like:

AspectJUrlClassLoader loader = new AspectJUrlClassLoader(urls, parentLoader);
thread.setContextClassLoader(loader);
if (parameters.getUseTrace()) {
     loader.deploy(TraceAspect.class);
}
if (parameters.getUseCache()) {
     loader.deploy(CacheAspect.class);
}
if (parameters.getUseTime()) {
     loader.deploy(TimeAspect.class);
}
loader.prepareForWeave();
thread.start();

Then every class loaded from this new class loader is automatically weaved
if needed depending of registered aspects.

I have committed my current code here:
http://forge.codelutin.com/projects/isis-fish/repository/revisions/3822/show/branches/4.0.1/src/main/java/fr/ifremer/isisfish/aspect

Is it an approach that could be introduced into aspectj ?

-- 
Éric Chatellier - Code Lutin
Tel: 02.40.50.29.28 - http://www.codelutin.com

_______________________________________________
aspectj-users mailing list
aspectj-users@eclipse.org
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to