搜索类
package com.byd.mes.util;import java.io.File;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.lang.reflect.Modifier;import java.util.ArrayList;import java.util.List;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public class ClassDiscovery {private static final Log log = LogFactory.getLog(ClassDiscovery.class);public static List findByPackageNames(String webUrl,String interfaceName,String[] packageNames){final List clazzList=new ArrayList();if( packageNames == null) return null; for (String string : packageNames) {String url= StringUtils.getStr(string).replace(".", "\\");File[] files=new File(StringUtils.getStr(webUrl,"WEB-INF\\classes\\",url)).listFiles();for (File file : files) {String clasName=file.getName().replace(".class","");try {String packageName=StringUtils.getStr(string,".",clasName);//排除类部类,以及除接口/抽象类的java文件。if(!StringUtils.contains(packageName, '$') && isFunction(packageName, interfaceName)){Class class1=Class.forName(packageName).getClass();Object object=Class.forName(packageName).newInstance();clazzList.add(object);}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} }}return clazzList;}private static String getInvokeResult(Object object, Method[] method, int i)throws IllegalAccessException, InvocationTargetException {String result=(String)method[i].invoke(object);return result;}public static List findByDefaultPackageNames(String webUrl,String interfaceName){String key = "mes.dev["+interfaceName+"]";log.debug("mes dev key>>>"+key);String packageNamesStr = BeanFactory.getSystemParamters().get(key);log.debug("mes dev >>>"+packageNamesStr);String[] packageNames =packageNamesStr != null ? packageNamesStr.split(",") : new String[0];return findByPackageNames(webUrl,interfaceName,packageNames);}/** * @param packageName * @param interfaceName * @return * @throws ClassNotFoundException */private static boolean isFunction(String packageName,String interfaceName) throws ClassNotFoundException{Class c = Class.forName(packageName).getClass();if(c==null){log.debug("this class is null >>>>>> "+c);return false;}if(c.isInterface()){log.debug("this class is interface >>>>>>" + c);return false;}if(Modifier.isAbstract(c.getModifiers())){log.debug("this class is abstract >>>>>> "+c);return false;}Class<?>[] interfaces=c.getInterfaces();if(interfaces == null || interfaces.length == 0){log.debug("this interfaces is null or length be 0 >>>>>>> "+interfaces);return false;}try {Class class1 = Class.forName(interfaceName).getClass();if(class1.isAssignableFrom(c)){return true;}} catch (ClassNotFoundException e) {e.printStackTrace();}return false;}}?