KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > sun > org > apache > bcel > internal > util > JavaWrapper


1 package com.sun.org.apache.bcel.internal.util;
2
3 /* ====================================================================
4  * The Apache Software License, Version 1.1
5  *
6  * Copyright (c) 2001 The Apache Software Foundation. All rights
7  * reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  * notice, this list of conditions and the following disclaimer in
18  * the documentation and/or other materials provided with the
19  * distribution.
20  *
21  * 3. The end-user documentation included with the redistribution,
22  * if any, must include the following acknowledgment:
23  * "This product includes software developed by the
24  * Apache Software Foundation (http://www.apache.org/)."
25  * Alternately, this acknowledgment may appear in the software itself,
26  * if and wherever such third-party acknowledgments normally appear.
27  *
28  * 4. The names "Apache" and "Apache Software Foundation" and
29  * "Apache BCEL" must not be used to endorse or promote products
30  * derived from this software without prior written permission. For
31  * written permission, please contact apache@apache.org.
32  *
33  * 5. Products derived from this software may not be called "Apache",
34  * "Apache BCEL", nor may "Apache" appear in their name, without
35  * prior written permission of the Apache Software Foundation.
36  *
37  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40  * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
41  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48  * SUCH DAMAGE.
49  * ====================================================================
50  *
51  * This software consists of voluntary contributions made by many
52  * individuals on behalf of the Apache Software Foundation. For more
53  * information on the Apache Software Foundation, please see
54  * <http://www.apache.org/>.
55  */

56
57 import java.lang.reflect.*;
58
59 /**
60  * Java interpreter replacement, i.e., wrapper that uses its own ClassLoader
61  * to modify/generate classes as they're requested. You can take this as a template
62  * for your own applications.<br>
63  * Call this wrapper with
64  * <pre>java com.sun.org.apache.bcel.internal.util.JavaWrapper &lt;real.class.name&gt; [arguments]</pre>
65  * <p>
66  * To use your own class loader you can set the "bcel.classloader" system property
67  * which defaults to "com.sun.org.apache.bcel.internal.util.ClassLoader", e.g., with
68  * <pre>java com.sun.org.apache.bcel.internal.util.JavaWrapper -Dbcel.classloader=foo.MyLoader &lt;real.class.name&gt; [arguments]</pre>
69  * </p>
70  *
71  * @version $Id: JavaWrapper.java,v 1.1.2.1 2005/07/31 23:47:01 jeffsuttor Exp $
72  * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
73  * @see ClassLoader
74  */

75 public class JavaWrapper {
76   private java.lang.ClassLoader JavaDoc loader;
77
78   private static java.lang.ClassLoader JavaDoc getClassLoader() {
79     String JavaDoc s = System.getProperty("bcel.classloader");
80
81     if((s == null) || "".equals(s))
82       s = "com.sun.org.apache.bcel.internal.util.ClassLoader";
83
84     try {
85       return (java.lang.ClassLoader JavaDoc)Class.forName(s).newInstance();
86     } catch(Exception JavaDoc e) {
87       throw new RuntimeException JavaDoc(e.toString());
88     }
89   }
90       
91   public JavaWrapper(java.lang.ClassLoader JavaDoc loader) {
92     this.loader = loader;
93   }
94
95   public JavaWrapper() {
96     this(getClassLoader());
97   }
98
99   /** Runs the _main method of the given class with the arguments passed in argv
100    *
101    * @param class_name the fully qualified class name
102    * @param argv the arguments just as you would pass them directly
103    */

104   public void runMain(String JavaDoc class_name, String JavaDoc[] argv) throws ClassNotFoundException JavaDoc
105   {
106     Class JavaDoc cl = loader.loadClass(class_name);
107     Method method = null;
108
109     try {
110       method = cl.getMethod("_main", new Class JavaDoc[] { argv.getClass() });
111       
112       /* Method _main is sane ?
113        */

114       int m = method.getModifiers();
115       Class JavaDoc r = method.getReturnType();
116       
117       if(!(Modifier.isPublic(m) && Modifier.isStatic(m)) ||
118      Modifier.isAbstract(m) || (r != Void.TYPE))
119     throw new NoSuchMethodException JavaDoc();
120     } catch(NoSuchMethodException JavaDoc no) {
121       System.out.println("In class " + class_name +
122              ": public static void _main(String[] argv) is not defined");
123       return;
124     }
125     
126     try {
127       method.invoke(null, new Object JavaDoc[] { argv });
128     } catch(Exception JavaDoc ex) {
129       ex.printStackTrace();
130     }
131   }
132
133   /** Default _main method used as wrapper, expects the fully qualified class name
134    * of the real class as the first argument.
135    */

136   public static void _main(String JavaDoc[] argv) throws Exception JavaDoc {
137     /* Expects class name as first argument, other arguments are by-passed.
138      */

139     if(argv.length == 0) {
140       System.out.println("Missing class name.");
141       return;
142     }
143
144     String JavaDoc class_name = argv[0];
145     String JavaDoc[] new_argv = new String JavaDoc[argv.length - 1];
146     System.arraycopy(argv, 1, new_argv, 0, new_argv.length);
147
148     JavaWrapper wrapper = new JavaWrapper();
149     wrapper.runMain(class_name, new_argv);
150   }
151 }
152
153
Popular Tags