To Silviu Andrica and Andy Clement or whoever remembers this old thread:
http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg11505.html

> If you add "-Xbootclasspath/p:<path_to_aspects.jar>" JVM option, then you can 
> instrument inside the JDKs and also instrument already loaded classes.

I am interested in the second option (the former afterwards maybe). How do you 
use this class to instrument and replace an already loaded class? I mean do you 
have a code snippet showing which parameters you submit to "transform" and hoow 
to replace an already loaded class? Specifically:
  - Which loader do you use? A WeavingURLClassLoader or the
    loader the weaving target was initially loaded by?
  - Where does the byte array for the class to be woven come from?
    Can I get the class's bytes somehwere from memory or do I need
    to re-load the actual .class file from disk/URL/JAR/whatever?

Sorry, this is my first time being so deep into the internal LTW process.
-- 
Alexander Kriegisch


Silviu Andrica wrote in 2009:
> Hello,
> 
> I looked through AspectJ's Load Time Weaver and I combined it with your code 
> suggestion.
> This is what I got out
> 
> import java.lang.instrument.ClassFileTransformer;
> import java.lang.instrument.IllegalClassFormatException;
> import java.security.ProtectionDomain;
> import java.util.ArrayList;
> import java.util.Arrays;
> import java.util.List;
> import java.util.Map;
> import java.util.concurrent.ConcurrentHashMap;
> 
> import org.aspectj.weaver.loadtime.Aj;
> import org.aspectj.weaver.loadtime.DefaultWeavingContext;
> import org.aspectj.weaver.loadtime.definition.Definition;
> import org.aspectj.weaver.tools.WeavingAdaptor;
> 
> public class AspectJLTW implements ClassFileTransformer {
> 
>       private class MonitorWeavingContext extends DefaultWeavingContext {
> 
>               public MonitorWeavingContext(ClassLoader loader) {
>                       super(loader);
>               }
> 
>               @Override
>               public List getDefinitions(ClassLoader loader, WeavingAdaptor 
> adaptor) {
>                       List definitions = new ArrayList();
>                       Definition d = new Definition();
>                       d.getAspectClassNames().add(aspectName);
>                       d.appendWeaverOptions("-Xjoinpoints:synchronization");
>                       definitions.add(d);
>                       return definitions;
>               }
> 
>       }
> 
>       private final Map<ClassLoader, Aj> mapFromClassLoaderToAj;
>       private final String aspectName;
> 
>       public AspectJLTW(String aspectName) {
>               try {
>                       mapFromClassLoaderToAj = new 
> ConcurrentHashMap<ClassLoader, Aj>();
>                       this.aspectName = aspectName;
>               } catch (Exception e) {
>                       throw new ExceptionInInitializerError(
>                                       "could not initialize JSR163 
> preprocessor due to: "
>                                                       + e.toString());
>               }
>       }
> 
>       /**
>        * Weaving delegation
>        * 
>        * @param loader
>        *            the defining class loader
>        * @param className
>        *            the name of class beeing loaded
>        * @param classBeingRedefined
>        *            when hotswap is called
>        * @param protectionDomain
>        * @param bytes
>        *            the bytecode before weaving
>        * @return the weaved bytecode
>        */
>       public byte[] transform(ClassLoader loader, String className,
>                       Class<?> classBeingRedefined, ProtectionDomain 
> protectionDomain,
>                       byte[] bytes) throws IllegalClassFormatException {
>               if (className.replace("/", ".").equals(aspectName))
>                       return null;
>               Aj aj = getInstrumenter(loader);
>               byte[] b = aj.preProcess(className, bytes, loader);
>               if (Arrays.equals(bytes, b))
>                       return null;
>               return b;
>       }
> 
>       private Aj getInstrumenter(ClassLoader loader) {
>               if (mapFromClassLoaderToAj.containsKey(loader)) {
>                       return mapFromClassLoaderToAj.get(loader);
>               }
>               Aj aj = new Aj(new MonitorWeavingContext(loader));
>               mapFromClassLoaderToAj.put(loader, aj);
>               return aj;
>       }
> }
> 
> If you add "-Xbootclasspath/p:<path_to_aspects.jar>" JVM option, then you can 
> instrument inside the JDKs and also instrument already loaded classes.
> I tried it on Java 1.6.0_15 on Mac OSX.
> 
> One little note: JVM complains about java.lang.UnsupportedOperationException: 
> class redefinition failed: attempted to change the schema (add/remove 
> fields). I suspect t has something to do with AspectJ adding extra fields. Is 
> there a way to force inlining of the aspects?
_______________________________________________
aspectj-users mailing list
aspectj-users@eclipse.org
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to