KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > name > dsouflis > aop > tracing > Trace


1 package name.dsouflis.aop.tracing;
2
3 import java.lang.reflect.*;
4
5 /**
6  * Runs class using TracingClassLoader, user specifies class to trace. 
7  * Adapted from BCEL's de.fub.bytecode.util.JavaWrapper.<br>
8  * Original credits follow:
9  * Java interpreter replacement, i.e., wrapper that uses its own ClassLoader
10  * to modify/generate classes as they're requested. You can take this as a template
11  * for your own applications.<br>
12  * @version $Id: JavaWrapper.java,v 1.3 2001/08/24 13:56:51 dahm Exp $
13  * @author <A HREF="http://www.berlin.de/~markus.dahm/">M. Dahm</A>
14  * @see ClassLoader
15  */

16 public class Trace {
17     private java.lang.ClassLoader JavaDoc loader;
18
19     public Trace(java.lang.ClassLoader JavaDoc loader) {
20         this.loader = loader;
21     }
22
23     /** Runs the main method of the given class with the arguments passed in argv
24      *
25      * @param class_name the fully qualified class name
26      * @param argv the arguments just as you would pass them directly
27      */

28     public void runMain(String JavaDoc class_name, String JavaDoc[] argv) throws ClassNotFoundException JavaDoc
29     {
30         Class JavaDoc cl = loader.loadClass(class_name);
31         Method method = null;
32
33         try {
34         method = cl.getMethod("main", new Class JavaDoc[] { argv.getClass() });
35
36             /* Method main is sane ?
37              */

38             int m = method.getModifiers();
39             Class JavaDoc r = method.getReturnType();
40
41             if(!(Modifier.isPublic(m) && Modifier.isStatic(m)) ||
42             Modifier.isAbstract(m) || (r != Void.TYPE))
43             throw new NoSuchMethodException JavaDoc();
44         } catch(NoSuchMethodException JavaDoc no) {
45             System.out.println("In class " + class_name +
46             ": public static void main(String[] argv) is not defined");
47             return;
48         }
49
50         try {
51         method.invoke(null, new Object JavaDoc[] { argv });
52         } catch(Exception JavaDoc ex) {
53             ex.printStackTrace();
54         }
55     }
56
57     /** Default main method used as wrapper, expects a comma-separated list of
58      * the fully qualified class names
59      * of the classes to trace as the first argument and the real class to run as a second one.
60      */

61     public static void main(String JavaDoc[] argv) throws Exception JavaDoc {
62         /* Expects class name to trace as first argument, class name to run as second argument,
63          *other arguments are passed through.
64          */

65         if(argv.length <2) {
66             System.out.println("Missing class name to trace and class name to run.");
67             return;
68         }
69
70         String JavaDoc classNameToTrace= argv[0];
71         String JavaDoc className = argv[1];
72         String JavaDoc[] new_argv = new String JavaDoc[argv.length - 2];
73         System.arraycopy(argv, 2, new_argv, 0, new_argv.length);
74
75         final java.util.Vector JavaDoc classNamesVec=new java.util.Vector JavaDoc();
76         java.util.StringTokenizer JavaDoc tz=new java.util.StringTokenizer JavaDoc(classNameToTrace,",");
77         while(tz.hasMoreTokens()) {
78             String JavaDoc classNameToken=tz.nextToken();
79             classNamesVec.add(classNameToken);
80             System.out.print("Will trace ");
81             System.out.println(classNameToken);
82         }
83         ClassMethodFilter flt=new ClassMethodFilter() {
84             public boolean classHasAdvice(String JavaDoc className) {
85                 boolean outcome=classNamesVec.indexOf(className)!=-1;
86                 if(outcome) {
87                     System.out.print("Tracing ");
88                     System.out.println(className);
89                 }
90                 return outcome;
91             }
92             public boolean methodHasAdvice(String JavaDoc className, String JavaDoc methodName, String JavaDoc signature) {
93                 return true;
94             }
95         };
96         ClassLoader JavaDoc loader=new TracingClassLoader(flt);
97         Trace wrapper = new Trace(loader);
98         wrapper.runMain(className, new_argv);
99     }
100 }
101
102
Popular Tags