反射機制調用protected保護方法加載jar

package com.web.app.listener.util;

import org.apache.catalina.loader.WebappClassLoader;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;

import javax.management.loading.MLet;

import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;

import com.web.utils.FileUtil;
import com.web.utils.XmlReaderUtil;

/**
 * 啓動裝在額外jar包工具類,實例化後調用loadJar方法裝在 需要配置好configfilepath配置文件, xml格式<config>
 * <jarFile></jarFile> //類路徑 classpath:開頭 跟“/a.jar” //lib路徑 libpath:開頭跟"/a.jar"
 * </config>
 * 
 * @author Administrator
 *
 */
public class LoadJarUtil {
	private Logger log = Logger.getLogger(this.getClass());
	private final String ROOT_ELEMENT_NAME = "config";
	private final String NODE_ELEMENT_NAME = "jarFile";
	private String configfilepath;

	public LoadJarUtil(String configpath) {
		this.configfilepath = configpath;
		log.info("Add Jar configfile path:" + configpath);
	}

	/**
	 * loadJar from config file {@configfilepath};
	 */
	public void loadJar() {
		File configfile = FileUtil.getFile(configfilepath);
		if (configfile == null || !configfile.exists() || !configfile.isFile()) {
			log.warn("Error to instantiate configfile object,configfile is wrong.");
			return;
		}
		ArrayList<File> loadfile = new ArrayList<File>();
		try {
			Document dom = XmlReaderUtil.readXmlFromFile(configfile);
			Element root = dom.getRootElement();
			if (ROOT_ELEMENT_NAME.equals(root.getName())) {
				List<Element> list = (List<Element>) root
						.elements(NODE_ELEMENT_NAME);
				if (list != null && list.size() > 0) {
					for (Element e : list) {
						String loadjar_str = e.getText();
						// System.out.println(loadjar_str);
						if (loadjar_str.indexOf(".jar") > 0) {
							File loadjar_fl = FileUtil.getFile(loadjar_str);
							if (loadjar_fl != null && loadjar_fl.exists()
									&& loadjar_fl.isFile()) {
								loadfile.add(loadjar_fl);
							}
						}
					}
				} else {
					log.warn("No jarFile to load.");
				}
			}
		} catch (DocumentException e1) {
			log.error("", e1);
		} catch (IOException e1) {
			log.error("", e1);
		}

		if (loadfile.size() == 0) {
			log.warn("LoadJar list is empty.Stop to load.");
			return;
		}

		ClassLoader cls = 
		 Thread.currentThread().getContextClassLoader();
		System.out.println(cls.getClass().getName());
		URLClassLoader cload = null;
		org.apache.catalina.loader.WebappClassLoader wcload = null;
		if("java.net.URLClassLoader".equals(cls.getClass().getName())){
			cload = (URLClassLoader)cls;
		}else if("org.apache.catalina.loader.WebappClassLoader".equals(cls.getClass().getName())){
			wcload = (WebappClassLoader)cls;
		}
		try {
			
			  if(cload!=null){//tomcat6 classloader
				  Class[] margs = new Class[]{URL.class}; 
				  Method method = cload.getClass().getDeclaredMethod("addURL", margs);
				  method.setAccessible(true); 
				  if(method!=null){ 
				  	for(File loadf:loadfile){ 
				  		URL url = loadf.toURI().toURL();
				 		method.invoke(cload,new Object[]{url}); 
				 		log.info("LoadJar:"+url.toString()); 
				  	} 
				  }
			  }else if(wcload!=null){//tomcat7 classloader
				  for(File loadf:loadfile){ 
			  		String fileurl = loadf.toURI().toURL().toString();
			  		wcload.addRepository(fileurl);
			 		log.info("LoadJar:"+fileurl);
				  } 
			  }
		} catch (SecurityException e) {
			log.error("", e);
		} catch (Exception e) {
			log.error("", e);
		}
		Runtime.getRuntime().gc();
	}

	public String getConfigfilepath() {
		return configfilepath;
	}

	public void setConfigfilepath(String configfilepath) {
		this.configfilepath = configfilepath;
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章