1 /* |
|
2 * reserved comment block |
|
3 * DO NOT REMOVE OR ALTER! |
|
4 */ |
|
5 package com.sun.org.apache.bcel.internal.util; |
|
6 |
|
7 /* ==================================================================== |
|
8 * The Apache Software License, Version 1.1 |
|
9 * |
|
10 * Copyright (c) 2001 The Apache Software Foundation. All rights |
|
11 * reserved. |
|
12 * |
|
13 * Redistribution and use in source and binary forms, with or without |
|
14 * modification, are permitted provided that the following conditions |
|
15 * are met: |
|
16 * |
|
17 * 1. Redistributions of source code must retain the above copyright |
|
18 * notice, this list of conditions and the following disclaimer. |
|
19 * |
|
20 * 2. Redistributions in binary form must reproduce the above copyright |
|
21 * notice, this list of conditions and the following disclaimer in |
|
22 * the documentation and/or other materials provided with the |
|
23 * distribution. |
|
24 * |
|
25 * 3. The end-user documentation included with the redistribution, |
|
26 * if any, must include the following acknowledgment: |
|
27 * "This product includes software developed by the |
|
28 * Apache Software Foundation (http://www.apache.org/)." |
|
29 * Alternately, this acknowledgment may appear in the software itself, |
|
30 * if and wherever such third-party acknowledgments normally appear. |
|
31 * |
|
32 * 4. The names "Apache" and "Apache Software Foundation" and |
|
33 * "Apache BCEL" must not be used to endorse or promote products |
|
34 * derived from this software without prior written permission. For |
|
35 * written permission, please contact apache@apache.org. |
|
36 * |
|
37 * 5. Products derived from this software may not be called "Apache", |
|
38 * "Apache BCEL", nor may "Apache" appear in their name, without |
|
39 * prior written permission of the Apache Software Foundation. |
|
40 * |
|
41 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED |
|
42 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
|
43 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
|
44 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR |
|
45 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
46 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
47 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
|
48 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
|
49 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
|
50 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
|
51 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|
52 * SUCH DAMAGE. |
|
53 * ==================================================================== |
|
54 * |
|
55 * This software consists of voluntary contributions made by many |
|
56 * individuals on behalf of the Apache Software Foundation. For more |
|
57 * information on the Apache Software Foundation, please see |
|
58 * <http://www.apache.org/>. |
|
59 */ |
|
60 |
|
61 import java.lang.reflect.*; |
|
62 |
|
63 /** |
|
64 * Java interpreter replacement, i.e., wrapper that uses its own ClassLoader |
|
65 * to modify/generate classes as they're requested. You can take this as a template |
|
66 * for your own applications.<br> |
|
67 * Call this wrapper with |
|
68 * <pre>java com.sun.org.apache.bcel.internal.util.JavaWrapper <real.class.name> [arguments]</pre> |
|
69 * <p> |
|
70 * To use your own class loader you can set the "bcel.classloader" system property |
|
71 * which defaults to "com.sun.org.apache.bcel.internal.util.ClassLoader", e.g., with |
|
72 * <pre>java com.sun.org.apache.bcel.internal.util.JavaWrapper -Dbcel.classloader=foo.MyLoader <real.class.name> [arguments]</pre> |
|
73 * </p> |
|
74 * |
|
75 * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A> |
|
76 * @see ClassLoader |
|
77 */ |
|
78 public class JavaWrapper { |
|
79 private java.lang.ClassLoader loader; |
|
80 |
|
81 private static java.lang.ClassLoader getClassLoader() { |
|
82 String s = SecuritySupport.getSystemProperty("bcel.classloader"); |
|
83 |
|
84 if((s == null) || "".equals(s)) |
|
85 s = "com.sun.org.apache.bcel.internal.util.ClassLoader"; |
|
86 |
|
87 try { |
|
88 return (java.lang.ClassLoader)Class.forName(s).newInstance(); |
|
89 } catch(Exception e) { |
|
90 throw new RuntimeException(e.toString()); |
|
91 } |
|
92 } |
|
93 |
|
94 public JavaWrapper(java.lang.ClassLoader loader) { |
|
95 this.loader = loader; |
|
96 } |
|
97 |
|
98 public JavaWrapper() { |
|
99 this(getClassLoader()); |
|
100 } |
|
101 |
|
102 /** Runs the _main method of the given class with the arguments passed in argv |
|
103 * |
|
104 * @param class_name the fully qualified class name |
|
105 * @param argv the arguments just as you would pass them directly |
|
106 */ |
|
107 public void runMain(String class_name, String[] argv) throws ClassNotFoundException |
|
108 { |
|
109 Class cl = loader.loadClass(class_name); |
|
110 Method method = null; |
|
111 |
|
112 try { |
|
113 method = cl.getMethod("_main", new Class[] { argv.getClass() }); |
|
114 |
|
115 /* Method _main is sane ? |
|
116 */ |
|
117 int m = method.getModifiers(); |
|
118 Class r = method.getReturnType(); |
|
119 |
|
120 if(!(Modifier.isPublic(m) && Modifier.isStatic(m)) || |
|
121 Modifier.isAbstract(m) || (r != Void.TYPE)) |
|
122 throw new NoSuchMethodException(); |
|
123 } catch(NoSuchMethodException no) { |
|
124 System.out.println("In class " + class_name + |
|
125 ": public static void _main(String[] argv) is not defined"); |
|
126 return; |
|
127 } |
|
128 |
|
129 try { |
|
130 method.invoke(null, new Object[] { argv }); |
|
131 } catch(Exception ex) { |
|
132 ex.printStackTrace(); |
|
133 } |
|
134 } |
|
135 |
|
136 /** Default _main method used as wrapper, expects the fully qualified class name |
|
137 * of the real class as the first argument. |
|
138 */ |
|
139 public static void _main(String[] argv) throws Exception { |
|
140 /* Expects class name as first argument, other arguments are by-passed. |
|
141 */ |
|
142 if(argv.length == 0) { |
|
143 System.out.println("Missing class name."); |
|
144 return; |
|
145 } |
|
146 |
|
147 String class_name = argv[0]; |
|
148 String[] new_argv = new String[argv.length - 1]; |
|
149 System.arraycopy(argv, 1, new_argv, 0, new_argv.length); |
|
150 |
|
151 JavaWrapper wrapper = new JavaWrapper(); |
|
152 wrapper.runMain(class_name, new_argv); |
|
153 } |
|
154 } |
|