View Javadoc
1 package org.apache.bcel.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 org.apache.bcel.util.JavaWrapper <real.class.name> [arguments]</pre> 65 * <p> 66 * To use your own class loader you can set the "bcel.classloader" system property 67 * which defaults to "org.apache.bcel.util.ClassLoader", e.g., with 68 * <pre>java org.apache.bcel.util.JavaWrapper -Dbcel.classloader=foo.MyLoader <real.class.name> [arguments]</pre> 69 * </p> 70 * 71 * @version $Id: JavaWrapper.java,v 1.1.1.1 2001/10/29 20:00:30 jvanzyl 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 loader; 77 78 private static java.lang.ClassLoader getClassLoader() { 79 String s = System.getProperty("bcel.classloader"); 80 81 if((s == null) || "".equals(s)) 82 s = "org.apache.bcel.util.ClassLoader"; 83 84 try { 85 return (java.lang.ClassLoader)Class.forName(s).newInstance(); 86 } catch(Exception e) { 87 throw new RuntimeException(e.toString()); 88 } 89 } 90 91 public JavaWrapper(java.lang.ClassLoader 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 class_name, String[] argv) throws ClassNotFoundException 105 { 106 Class cl = loader.loadClass(class_name); 107 Method method = null; 108 109 try { 110 method = cl.getMethod("main", new Class[] { argv.getClass() }); 111 112 /* Method main is sane ? 113 */ 114 int m = method.getModifiers(); 115 Class r = method.getReturnType(); 116 117 if(!(Modifier.isPublic(m) && Modifier.isStatic(m)) || 118 Modifier.isAbstract(m) || (r != Void.TYPE)) 119 throw new NoSuchMethodException(); 120 } catch(NoSuchMethodException 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[] { argv }); 128 } catch(Exception 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[] argv) throws Exception { 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 class_name = argv[0]; 145 String[] new_argv = new String[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

This page was automatically generated by Maven