/************************************************************************************** * Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. * * http://aspectwerkz.codehaus.org * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the LGPL license * * a copy of which has been included with this distribution in the license.txt file. * **************************************************************************************/ package org.codehaus.aspectwerkz.hook.impl; import sun.misc.Resource; import sun.misc.URLClassPath; import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.StringTokenizer; /** * Very basic classloader that do online weaving. <p/>This classloader can be used thru several means * <ul> * <li>as a URLClassLoader in a custom development</li> * <li>as a <i>MainClass </i> to allow on the fly weaving (without support for classloader hierarchy)</li> * </ul> * It can also be used for debugging step by step in any IDE * * @author <a href="mailto:alex@gnilux.com">Alexandre Vasseur </a> * @todo rewrite based on SUN src (definePackage missing) */ public class WeavingClassLoader extends URLClassLoader { public WeavingClassLoader(URL[] urls, ClassLoader parent) { super(urls, parent); } protected Class findClass(String name) throws ClassNotFoundException { String path = name.replace('.', '/').concat(".class"); Resource res = new URLClassPath(getURLs()).getResource(path, false); if (res != null) { //definePackage(name.substring(0, name.lastIndexOf(".")), null, null); try { byte[] b = res.getBytes(); byte[] transformed = ClassPreProcessorHelper.defineClass0Pre(this, name, b, 0, b.length, null); return defineClass(name, transformed, 0, transformed.length); } catch (IOException e) { throw new ClassNotFoundException(e.getMessage()); } } else { throw new ClassNotFoundException(name); } } public static void main(String[] args) throws Exception { String path = System.getProperty("java.class.path"); ArrayList paths = new ArrayList(); StringTokenizer st = new StringTokenizer(path, File.pathSeparator); while (st.hasMoreTokens()) { paths.add((new File(st.nextToken())).getCanonicalFile().toURL()); } //System.setProperty("aspectwerkz.transform.verbose", "yes"); //System.setProperty("aspectwerkz.transform.dump", "*"); //System.setProperty("aspectwerkz.definition.file", "..."); //@todo check child of extension classloader instead of boot classloader ClassLoader cl = new WeavingClassLoader( (URL[]) paths.toArray(new URL[]{}), ClassLoader.getSystemClassLoader() .getParent() ); Thread.currentThread().setContextClassLoader(cl); String s = args[0]; String[] args1 = new String[args.length - 1]; if (args1.length > 0) { System.arraycopy(args, 1, args1, 0, args.length - 1); } Class class1 = Class.forName(s, false, cl); Method method = class1.getMethod( "main", new Class[]{ String[].class } ); method.invoke( null, new Object[]{ args1 } ); } }