📄 introspectionutils.java
字号:
sb.append( value.substring( prev, pos ) ); } if( pos == (value.length() - 1)) { sb.append('$'); prev = pos + 1; } else if (value.charAt( pos + 1 ) != '{' ) { sb.append( value.charAt( pos + 1 ) ); prev=pos+2; // XXX } else { int endName=value.indexOf( '}', pos ); if( endName < 0 ) { sb.append( value.substring( pos )); prev=value.length(); continue; } String n=value.substring( pos+2, endName ); String v= null; if( staticProp != null ) { v=(String)((Hashtable)staticProp).get(n); } if( v==null && dynamicProp != null) { for( int i=0; i<dynamicProp.length; i++ ) { v=dynamicProp[i].getProperty( n ); if( v!=null ) { break; } } } if( v== null ) v = "${"+n+"}"; sb.append( v ); prev=endName+1; } } if( prev < value.length() ) sb.append( value.substring( prev ) ); return sb.toString(); } /** Reverse of Introspector.decapitalize */ public static String capitalize(String name) { if (name == null || name.length() == 0) { return name; } char chars[] = name.toCharArray(); chars[0] = Character.toUpperCase(chars[0]); return new String(chars); } public static String unCapitalize(String name) { if (name == null || name.length() == 0) { return name; } char chars[] = name.toCharArray(); chars[0] = Character.toLowerCase(chars[0]); return new String(chars); } // -------------------- Class path tools -------------------- /** Add all the jar files in a dir to the classpath, * represented as a Vector of URLs. */ public static void addToClassPath( Vector cpV, String dir ) { try{ String cpComp[]=getFilesByExt(dir, ".jar"); if (cpComp != null){ int jarCount=cpComp.length; for( int i=0; i< jarCount ; i++ ) { URL url=getURL( dir , cpComp[i] ); if( url!=null ) cpV.addElement( url ); } } }catch(Exception ex){ ex.printStackTrace(); } } public static void addToolsJar( Vector v ) { try { // Add tools.jar in any case File f=new File( System.getProperty( "java.home" ) + "/../lib/tools.jar"); if( ! f.exists() ) { // On some systems java.home gets set to the root of jdk. // That's a bug, but we can work around and be nice. f=new File( System.getProperty( "java.home" ) + "/lib/tools.jar"); if( f.exists() ) { System.out.println("Detected strange java.home value " + System.getProperty( "java.home" ) + ", it should point to jre"); } } URL url=new URL( "file", "" , f.getAbsolutePath() ); v.addElement( url ); } catch ( MalformedURLException ex ) { ex.printStackTrace(); } } /** Return all files with a given extension in a dir */ public static String[] getFilesByExt( String ld, String ext ) { File dir = new File(ld); String[] names=null; final String lext=ext; if (dir.isDirectory()){ names = dir.list( new FilenameFilter(){ public boolean accept(File d, String name) { if (name.endsWith(lext)){ return true; } return false; } }); } return names; } /** Construct a file url from a file, using a base dir */ public static URL getURL( String base, String file ) { try { File baseF = new File(base); File f = new File(baseF,file); String path = f.getCanonicalPath(); if( f.isDirectory() ){ path +="/"; } if( ! f.exists() ) return null; return new URL( "file", "", path ); } catch (Exception ex) { ex.printStackTrace(); return null; } } /** * add elements from the classpath <i>cp</i> to a Vector * <i>jars</i> as file URLs (We use Vector for JDK 1.1 compat). * <p> * @param <b>cp</b> a String classpath of directory or jar file * elements separated by path.separator delimiters. * @return a Vector of URLs. */ public static void addJarsFromClassPath(Vector jars, String cp) throws IOException,MalformedURLException { String sep = System.getProperty("path.separator"); String token; StringTokenizer st; if(cp!=null){ st = new StringTokenizer(cp,sep); while(st.hasMoreTokens()){ File f = new File(st.nextToken()); String path = f.getCanonicalPath(); if(f.isDirectory()){ path += "/"; } URL url = new URL("file","",path); if(!jars.contains(url)){ jars.addElement(url); } } } } /** Return a URL[] that can be used to construct a class loader */ public static URL[] getClassPath(Vector v){ URL[] urls=new URL[ v.size() ]; for( int i=0; i<v.size(); i++ ) { urls[i]=(URL)v.elementAt( i ); } return urls; } /** Construct a URL classpath from files in a directory, * a cpath property, and tools.jar. */ public static URL[] getClassPath( String dir, String cpath, String cpathProp, boolean addTools ) throws IOException, MalformedURLException { Vector jarsV = new Vector(); if( dir!=null ) { // Add dir/classes first, if it exists URL url=getURL( dir, "classes"); if( url!=null ) jarsV.addElement(url); addToClassPath( jarsV, dir ); } if( cpath != null ) addJarsFromClassPath(jarsV,cpath); if( cpathProp!=null ) { String cpath1=System.getProperty( cpathProp ); addJarsFromClassPath(jarsV,cpath1); } if(addTools) addToolsJar( jarsV ); return getClassPath(jarsV); } // -------------------- Mapping command line params to setters public static boolean processArgs(Object proxy, String args[] ) throws Exception { String args0[]=null; if( null != findMethod( proxy.getClass(), "getOptions1", new Class[] {} )) { args0=(String[])callMethod0( proxy, "getOptions1"); } if( args0==null ) { //args0=findVoidSetters(proxy.getClass()); args0=findBooleanSetters(proxy.getClass()); } Hashtable h=null; if( null != findMethod( proxy.getClass(), "getOptionAliases", new Class[] {} )) { h=(Hashtable)callMethod0( proxy, "getOptionAliases"); } return processArgs( proxy, args, args0, null, h ); } public static boolean processArgs(Object proxy, String args[], String args0[], String args1[], Hashtable aliases ) throws Exception { for( int i=0; i< args.length; i++ ) { String arg=args[i]; if( arg.startsWith("-")) arg=arg.substring(1); if( aliases != null && aliases.get( arg ) != null) arg=(String)aliases.get(arg); if( args0!=null ) { boolean set=false; for( int j=0; j< args0.length ; j++ ) { if( args0[j].equalsIgnoreCase( arg )) { setProperty( proxy, args0[j], "true"); set=true; break; } } if( set ) continue; } if( args1!=null ) { for( int j=0; j< args1.length ; j++ ) { if( args1[j].equalsIgnoreCase( arg )) { i++; if( i >= args.length ) return false; setProperty( proxy, arg, args[i]); break; } } } else { // if args1 is not specified,assume all other options have param i++; if( i >= args.length ) return false; setProperty( proxy,arg, args[i]); } } return true; } // -------------------- other utils -------------------- public static String[] findVoidSetters( Class c ) { Method m[]=findMethods( c ); if( m==null ) return null; Vector v=new Vector(); for( int i=0; i<m.length; i++ ) { if( m[i].getName().startsWith("set") && m[i].getParameterTypes().length == 0 ) { String arg=m[i].getName().substring( 3 ); v.addElement( unCapitalize( arg )); } } String s[]=new String[v.size()]; for( int i=0; i<s.length; i++ ) { s[i]=(String)v.elementAt( i ); } return s; } public static String[] findBooleanSetters( Class c ) { Method m[]=findMethods( c ); if( m==null ) return null; Vector v=new Vector(); for( int i=0; i<m.length; i++ ) { if( m[i].getName().startsWith("set") && m[i].getParameterTypes().length == 1 && "boolean".equalsIgnoreCase( m[i].getParameterTypes()[0].getName()) ) { String arg=m[i].getName().substring( 3 ); v.addElement( unCapitalize( arg )); } } String s[]=new String[v.size()]; for( int i=0; i<s.length; i++ ) { s[i]=(String)v.elementAt( i ); } return s; } static Hashtable objectMethods=new Hashtable(); public static Method[] findMethods( Class c ) { Method methods[]= (Method [])objectMethods.get( c ); if( methods != null ) return methods; methods=c.getMethods(); objectMethods.put( c, methods ); return methods; } public static Method findMethod( Class c, String name, Class params[] ) { Method methods[] = findMethods( c ); if( methods==null ) return null; for (int i = 0; i < methods.length; i++) { if (methods[i].getName().equals(name) ) { Class methodParams[]=methods[i].getParameterTypes(); if( methodParams==null ) if( params==null || params.length==0 ) return methods[i]; if( params==null ) if( methodParams==null || methodParams.length==0 ) return methods[i]; if( params.length != methodParams.length ) continue; boolean found=true; for( int j=0; j< params.length; j++ ) { if( params[j] != methodParams[j] ) { found=false; break; } } if( found ) return methods[i]; } } return null; } /** Test if the object implements a particular * method */ public static boolean hasHook( Object obj, String methodN ) { try { Method myMethods[]=findMethods( obj.getClass() ); for( int i=0; i< myMethods.length; i++ ) { if( methodN.equals ( myMethods[i].getName() )) { // check if it's overriden Class declaring=myMethods[i].getDeclaringClass(); Class parentOfDeclaring=declaring.getSuperclass(); // this works only if the base class doesn't extend // another class. // if the method is declared in a top level class // like BaseInterceptor parent is Object, otherwise // parent is BaseInterceptor or an intermediate class if( ! "java.lang.Object". equals(parentOfDeclaring.getName() )) { return true; } } } } catch ( Exception ex ) { ex.printStackTrace(); } return false; } public static void callMain( Class c, String args[] ) throws Exception { Class p[]=new Class[1]; p[0]=args.getClass(); Method m=c.getMethod( "main", p); m.invoke( c, new Object[] {args} ); } public static Object callMethod1( Object target, String methodN, Object param1, String typeParam1, ClassLoader cl) throws Exception { if( target==null || param1==null ) { d("Assert: Illegal params " + target + " " + param1 ); } if( dbg > 0 ) d("callMethod1 " + target.getClass().getName() + " " + param1.getClass().getName() + " " + typeParam1 ); Class params[]=new Class[1]; if( typeParam1==null ) params[0]=param1.getClass(); else params[0]=cl.loadClass( typeParam1 ); Method m=findMethod( target.getClass(), methodN, params); if( m==null ) throw new NoSuchMethodException(target.getClass().getName() + " " + methodN); return m.invoke(target, new Object[] {param1 } ); } public static Object callMethod0( Object target, String methodN) throws Exception { if( target==null ) { d("Assert: Illegal params " + target ); return null; } if( dbg > 0 ) d("callMethod0 " + target.getClass().getName() + "." + methodN); Class params[]=new Class[0]; Method m=findMethod( target.getClass(), methodN, params); if( m==null ) throw new NoSuchMethodException(target.getClass().getName() + " " + methodN); return m.invoke(target, emptyArray ); } static Object[] emptyArray=new Object[] {}; public static Object callMethodN( Object target, String methodN, Object params[], Class typeParams[] ) throws Exception { Method m=null; m=findMethod( target.getClass(), methodN, typeParams ); if( m== null ) { d("Can't find method " + methodN + " in " + target + " CLASS " + target.getClass()); return null; } Object o=m.invoke( target, params ); if(dbg > 0 ) { // debug StringBuffer sb=new StringBuffer(); sb.append("" + target.getClass().getName() + "." + methodN + "( " ); for(int i=0; i<params.length; i++ ) { if(i>0) sb.append( ", "); sb.append(params[i]); } sb.append(")"); d(sb.toString()); } return o; } // -------------------- Get property -------------------- // This provides a layer of abstraction public static interface PropertySource { public String getProperty( String key ); } public static interface AttributeHolder { public void setAttribute( String key, Object o ); } // debug -------------------- static final int dbg=0; static void d(String s ) { System.out.println("IntrospectionUtils: " + s ); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -