KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tc > aspectwerkz > hook > impl > WeavingClassLoader


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
3  */

4 package com.tc.aspectwerkz.hook.impl;
5
6 import sun.misc.Resource;
7 import sun.misc.URLClassPath;
8
9 import java.io.File JavaDoc;
10 import java.io.IOException JavaDoc;
11 import java.lang.reflect.Method JavaDoc;
12 import java.net.URL JavaDoc;
13 import java.net.URLClassLoader JavaDoc;
14 import java.util.ArrayList JavaDoc;
15 import java.util.StringTokenizer JavaDoc;
16
17 /**
18  * Very basic classloader that do online weaving. <p/>This classloader can be used thru several means
19  * <ul>
20  * <li>as a URLClassLoader in a custom development</li>
21  * <li>as a <i>MainClass </i> to allow on the fly weaving (without support for classloader hierarchy)</li>
22  * </ul>
23  * It can also be used for debugging step by step in any IDE
24  *
25  * @author <a HREF="mailto:alex@gnilux.com">Alexandre Vasseur </a>
26  * TODO rewrite based on SUN src (definePackage missing)
27  */

28 public class WeavingClassLoader extends URLClassLoader JavaDoc {
29   public WeavingClassLoader(URL JavaDoc[] urls, ClassLoader JavaDoc parent) {
30     super(urls, parent);
31   }
32
33   protected Class JavaDoc findClass(String JavaDoc name) throws ClassNotFoundException JavaDoc {
34     String JavaDoc path = name.replace('.', '/').concat(".class");
35     Resource res = new URLClassPath(getURLs()).getResource(path, false);
36     if (res != null) {
37       //definePackage(name.substring(0, name.lastIndexOf(".")), null, null);
38
try {
39         byte[] b = res.getBytes();
40         byte[] transformed = ClassPreProcessorHelper.defineClass0Pre(this, name, b, 0, b.length, null);
41         return defineClass(name, transformed, 0, transformed.length);
42       } catch (IOException JavaDoc e) {
43         throw new ClassNotFoundException JavaDoc(e.getMessage());
44       }
45     } else {
46       throw new ClassNotFoundException JavaDoc(name);
47     }
48   }
49
50   public static void main(String JavaDoc[] args) throws Exception JavaDoc {
51     String JavaDoc path = System.getProperty("java.class.path");
52     ArrayList JavaDoc paths = new ArrayList JavaDoc();
53     StringTokenizer JavaDoc st = new StringTokenizer JavaDoc(path, File.pathSeparator);
54     while (st.hasMoreTokens()) {
55       paths.add((new File JavaDoc(st.nextToken())).getCanonicalFile().toURL());
56     }
57
58     //System.setProperty("aspectwerkz.transform.verbose", "yes");
59
//System.setProperty("aspectwerkz.transform.dump", "*");
60
//System.setProperty("aspectwerkz.definition.file", "...");
61
// TODO check child of extension classloader instead of boot classloader
62
ClassLoader JavaDoc cl = new WeavingClassLoader(
63             (URL JavaDoc[]) paths.toArray(new URL JavaDoc[]{}), ClassLoader.getSystemClassLoader()
64             .getParent()
65     );
66     Thread.currentThread().setContextClassLoader(cl);
67     String JavaDoc s = args[0];
68     String JavaDoc[] args1 = new String JavaDoc[args.length - 1];
69     if (args1.length > 0) {
70       System.arraycopy(args, 1, args1, 0, args.length - 1);
71     }
72     Class JavaDoc class1 = Class.forName(s, false, cl);
73     Method JavaDoc method = class1.getMethod(
74             "main", new Class JavaDoc[]{
75             String JavaDoc[].class
76     }
77     );
78     method.invoke(
79             null, new Object JavaDoc[]{
80             args1
81     }
82     );
83   }
84 }
Popular Tags