1 package name.dsouflis.aop.tracing; 2 3 import java.lang.reflect.*; 4 5 16 public class Trace { 17 private java.lang.ClassLoader loader; 18 19 public Trace(java.lang.ClassLoader loader) { 20 this.loader = loader; 21 } 22 23 28 public void runMain(String class_name, String [] argv) throws ClassNotFoundException 29 { 30 Class cl = loader.loadClass(class_name); 31 Method method = null; 32 33 try { 34 method = cl.getMethod("main", new Class [] { argv.getClass() }); 35 36 38 int m = method.getModifiers(); 39 Class r = method.getReturnType(); 40 41 if(!(Modifier.isPublic(m) && Modifier.isStatic(m)) || 42 Modifier.isAbstract(m) || (r != Void.TYPE)) 43 throw new NoSuchMethodException (); 44 } catch(NoSuchMethodException 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 [] { argv }); 52 } catch(Exception ex) { 53 ex.printStackTrace(); 54 } 55 } 56 57 61 public static void main(String [] argv) throws Exception { 62 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 classNameToTrace= argv[0]; 71 String className = argv[1]; 72 String [] new_argv = new String [argv.length - 2]; 73 System.arraycopy(argv, 2, new_argv, 0, new_argv.length); 74 75 final java.util.Vector classNamesVec=new java.util.Vector (); 76 java.util.StringTokenizer tz=new java.util.StringTokenizer (classNameToTrace,","); 77 while(tz.hasMoreTokens()) { 78 String 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 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 className, String methodName, String signature) { 93 return true; 94 } 95 }; 96 ClassLoader loader=new TracingClassLoader(flt); 97 Trace wrapper = new Trace(loader); 98 wrapper.runMain(className, new_argv); 99 } 100 } 101 102 | Popular Tags |