📄 introspectionutils.java
字号:
/* * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.tomcat.util;import java.lang.reflect.*;import java.net.*;import java.io.*;import java.util.*;// Depends: JDK1.1/** * Utils for introspection and reflection */public final class IntrospectionUtils { /** Call execute() - any ant-like task should work */ public static void execute( Object proxy, String method ) throws Exception { Method executeM=null; Class c=proxy.getClass(); Class params[]=new Class[0]; // params[0]=args.getClass(); executeM=findMethod( c, method, params ); if( executeM == null ) { throw new RuntimeException("No execute in " + proxy.getClass() ); } executeM.invoke(proxy, null );//new Object[] { args }); } /** * Call void setAttribute( String ,Object ) */ public static void setAttribute( Object proxy, String n, Object v) throws Exception { if( proxy instanceof AttributeHolder ) { ((AttributeHolder)proxy).setAttribute( n, v ); return; } Method executeM=null; Class c=proxy.getClass(); Class params[]=new Class[2]; params[0]= String.class; params[1]= Object.class; executeM=findMethod( c, "setAttribute", params ); if( executeM == null ) { System.out.println("No setAttribute in " + proxy.getClass() ); return; } if( false ) System.out.println("Setting " + n + "=" + v + " in " + proxy); executeM.invoke(proxy, new Object[] { n, v }); return; } /** * Call void getAttribute( String ) */ public static Object getAttribute( Object proxy, String n) throws Exception { Method executeM=null; Class c=proxy.getClass(); Class params[]=new Class[1]; params[0]= String.class; executeM=findMethod( c, "getAttribute", params ); if( executeM == null ) { System.out.println("No getAttribute in " + proxy.getClass() ); return null; } return executeM.invoke(proxy, new Object[] { n }); } /** Construct a URLClassLoader. Will compile and work in JDK1.1 too. */ public static ClassLoader getURLClassLoader( URL urls[], ClassLoader parent ) { try { Class urlCL=Class.forName( "java.net.URLClassLoader"); Class paramT[]=new Class[2]; paramT[0]= urls.getClass(); paramT[1]=ClassLoader.class; Method m=findMethod( urlCL, "newInstance", paramT); if( m==null ) return null; ClassLoader cl=(ClassLoader)m.invoke( urlCL, new Object[] { urls, parent } ); return cl; } catch(ClassNotFoundException ex ) { // jdk1.1 return null; } catch(Exception ex ) { ex.printStackTrace(); return null; } } public static String guessInstall(String installSysProp, String homeSysProp, String jarName) { return guessInstall( installSysProp, homeSysProp, jarName, null); } /** Guess a product install/home by analyzing the class path. * It works for product using the pattern: lib/executable.jar * or if executable.jar is included in classpath by a shell * script. ( java -jar also works ) * * Insures both "install" and "home" System properties are set. * If either or both System properties are unset, "install" and * "home" will be set to the same value. This value will be * the other System property that is set, or the guessed value * if neither is set. */ public static String guessInstall(String installSysProp, String homeSysProp, String jarName, String classFile) { String install=null; String home=null; if ( installSysProp != null ) install=System.getProperty( installSysProp ); if( homeSysProp != null ) home=System.getProperty( homeSysProp ); if ( install != null ) { if ( home == null ) System.getProperties().put( homeSysProp, install ); return install; } // Find the directory where jarName.jar is located String cpath=System.getProperty( "java.class.path"); String pathSep=System.getProperty( "path.separator"); StringTokenizer st=new StringTokenizer( cpath, pathSep ); while( st.hasMoreTokens() ) { String path=st.nextToken(); // log( "path " + path ); if( path.endsWith( jarName ) ) { home=path.substring( 0, path.length() - jarName.length() ); try { if( "".equals(home) ) { home=new File("./").getCanonicalPath(); } else if( home.endsWith(File.separator) ) { home = home.substring(0,home.length()-1); } File f=new File( home ); String parentDir = f.getParent(); if(parentDir == null) parentDir = home; // unix style File f1=new File ( parentDir ); install = f1.getCanonicalPath(); if( installSysProp != null ) System.getProperties().put( installSysProp, install ); if( home == null && homeSysProp != null ) System.getProperties().put( homeSysProp, install ); return install; } catch( Exception ex ) { ex.printStackTrace(); } } else { String fname=path + ( path.endsWith("/") ?"":"/" ) + classFile; if( new File( fname ).exists()) { try { File f=new File( path ); String parentDir = f.getParent(); if( parentDir == null ) parentDir = path; // unix style File f1=new File ( parentDir ); install = f1.getCanonicalPath(); if( installSysProp != null ) System.getProperties().put( installSysProp, install ); if( home == null && homeSysProp != null ) System.getProperties().put( homeSysProp, install ); return install; } catch( Exception ex ) { ex.printStackTrace(); } } } } // if install directory can't be found, use home as the default if ( home != null ) { System.getProperties().put( installSysProp, home ); return home; } return null; } /** Debug method, display the classpath */ public static void displayClassPath( String msg, URL[] cp ) { System.out.println(msg); for( int i=0; i<cp.length; i++ ) { System.out.println( cp[i].getFile() ); } } public static String PATH_SEPARATOR = System.getProperty("path.separator"); /** * Adds classpath entries from a vector of URL's to the * "tc_path_add" System property. This System property lists * the classpath entries common to web applications. This System * property is currently used by Jasper when its JSP servlet * compiles the Java file for a JSP. */ public static String classPathAdd(URL urls[], String cp ) { if( urls==null ) return cp; for( int i=0; i<urls.length; i++ ) { if( cp != null) cp += PATH_SEPARATOR + urls[i].getFile(); else cp = urls[i].getFile(); } return cp; } /** Find a method with the right name If found, call the method ( if param is int or boolean we'll convert value to the right type before) - that means you can have setDebug(1). */ public static void setProperty( Object o, String name, String value ) { if( dbg > 1 ) d("setProperty(" + o.getClass() + " " + name + "=" + value +")" ); String setter= "set" +capitalize(name); try { Method methods[]=findMethods( o.getClass() ); Method setPropertyMethod=null; // First, the ideal case - a setFoo( String ) method for( int i=0; i< methods.length; i++ ) { Class paramT[]=methods[i].getParameterTypes(); if( setter.equals( methods[i].getName() ) && paramT.length == 1 && "java.lang.String".equals( paramT[0].getName())) { methods[i].invoke( o, new Object[] { value } ); return; } } // Try a setFoo ( int ) or ( boolean ) for( int i=0; i< methods.length; i++ ) { boolean ok=true; if( setter.equals( methods[i].getName() ) && methods[i].getParameterTypes().length == 1) { // match - find the type and invoke it Class paramType=methods[i].getParameterTypes()[0]; Object params[]=new Object[1]; // Try a setFoo ( int ) if ("java.lang.Integer".equals( paramType.getName()) || "int".equals( paramType.getName())) { try { params[0]=new Integer(value); } catch( NumberFormatException ex ) {ok=false;} // Try a setFoo ( boolean ) } else if ("java.lang.Boolean". equals( paramType.getName()) || "boolean".equals( paramType.getName())) { params[0]=new Boolean(value); // Try a setFoo ( InetAddress ) } else if ("java.net.InetAddress". equals( paramType.getName())){ try{ params[0]= InetAddress.getByName(value); }catch(UnknownHostException exc) { d("Unable to resolve host name:" + value); ok=false; } // Unknown type } else { d("Unknown type " + paramType.getName() ); } if( ok ) { methods[i].invoke( o, params ); return; } } // save "setProperty" for later if( "setProperty".equals( methods[i].getName())) { setPropertyMethod=methods[i]; } } // Ok, no setXXX found, try a setProperty("name", "value") if( setPropertyMethod != null ) { Object params[]=new Object[2]; params[0]=name; params[1]=value; setPropertyMethod.invoke( o, params ); } } catch( IllegalArgumentException ex2 ) { System.err.println("IAE " + o + " " + name + " " + value); ex2.printStackTrace(); } catch( SecurityException ex1 ) { if( dbg > 0 ) d("SecurityException for " + o.getClass() + " " + name + "=" + value +")" ); if( dbg > 1 ) ex1.printStackTrace(); } catch (IllegalAccessException iae) { if( dbg > 0 ) d("IllegalAccessException for " + o.getClass() + " " + name + "=" + value +")" ); if( dbg > 1 ) iae.printStackTrace(); } catch (InvocationTargetException ie) { if( dbg > 0 ) d("InvocationTargetException for " + o.getClass() + " " + name + "=" + value +")" ); if( dbg > 1 ) ie.printStackTrace(); } } public static Object getProperty( Object o, String name ) { String getter= "get" +capitalize(name); try { Method methods[]=findMethods( o.getClass() ); Method getPropertyMethod=null; // First, the ideal case - a getFoo() method for( int i=0; i< methods.length; i++ ) { Class paramT[]=methods[i].getParameterTypes(); if( getter.equals( methods[i].getName() ) && paramT.length == 0 ) { return methods[i].invoke( o, null ); } if( "getProperty".equals( methods[i].getName())) { getPropertyMethod=methods[i]; } if( "getAttribute".equals( methods[i].getName())) { getPropertyMethod=methods[i]; } } // Ok, no setXXX found, try a getProperty("name") if( getPropertyMethod != null ) { Object params[]=new Object[1]; params[0]=name; getPropertyMethod.invoke( o, params ); } } catch( IllegalArgumentException ex2 ) { System.err.println("IAE " + o + " " + name ); ex2.printStackTrace(); } catch( SecurityException ex1 ) { if( dbg > 0 ) d("SecurityException for " + o.getClass() + " " + name + ")" ); if( dbg > 1 ) ex1.printStackTrace(); } catch (IllegalAccessException iae) { if( dbg > 0 ) d("IllegalAccessException for " + o.getClass() + " " + name +")" ); if( dbg > 1 ) iae.printStackTrace(); } catch (InvocationTargetException ie) { if( dbg > 0 ) d("InvocationTargetException for " + o.getClass() + " " + name +")" ); if( dbg > 1 ) ie.printStackTrace(); } return null; } /** */ public static void setProperty( Object o, String name ) { String setter= "set" +capitalize(name); try { Method methods[]=findMethods( o.getClass() ); Method setPropertyMethod=null; // find setFoo() method for( int i=0; i< methods.length; i++ ) { Class paramT[]=methods[i].getParameterTypes(); if( setter.equals( methods[i].getName() ) && paramT.length == 0 ) { methods[i].invoke( o, new Object[] {} ); return; } } } catch( Exception ex1 ) { if( dbg > 0 ) d("Exception for " + o.getClass() + " " + name); if( dbg > 1 ) ex1.printStackTrace(); } } /** Replace ${NAME} with the property value * @deprecated. Use the explicit method */ public static String replaceProperties(String value, Object getter ) { if( getter instanceof Hashtable ) return replaceProperties( value, (Hashtable)getter, null ); if( getter instanceof PropertySource ) { PropertySource src[]=new PropertySource[] {(PropertySource)getter}; return replaceProperties( value, null, src); } return value; } /** Replace ${NAME} with the property value */ public static String replaceProperties(String value, Hashtable staticProp, PropertySource dynamicProp[] ) { StringBuffer sb=new StringBuffer(); int prev=0; // assert value!=nil int pos; while( (pos=value.indexOf( "$", prev )) >= 0 ) { if(pos>0) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -