搜索类

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;
	}
}

 

posted @ 2011-08-05 09:48  上善¤若水  阅读(151)  评论(0编辑  收藏  举报