Java运行时动态加载类之ClassLoader加载class及其依赖jar包
生活随笔
收集整理的這篇文章主要介紹了
Java运行时动态加载类之ClassLoader加载class及其依赖jar包
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
需求場景是:通過ClassLoader動態加載外部class文件,class文件又依賴某個具體jar包,需要動態加載jar包,采用URLClassLoader。
1、xml配置文件
<?xml version="1.0" encoding="ISO-8859-1"?> <classes><class name="User"> <jar>ETLEnc.jar</jar><method>say</method> </class> </classes>放在D:\\tmp\\目錄下;
2、User.class文件放在D:\\tmp\\目錄下,依賴ETLEnc.jar也放在D:\\tmp\\目錄下,User代碼如下:
package cn.fjs;import com.gddx.enc.ETLEncode;public class User {public void say(String name){ETLEncode ete=new ETLEncode();try {System.out.println(ete.encrypt(name));} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} } }其中com.gddx.enc.ETLEncode是ETLEnc.jar包中的類。
3、xml文件解析類代碼:
package cn.fjs;import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException;//解析xml文件,獲取類和方法 public class DynamicDom {private static DocumentBuilderFactory dbFactory = null; private static DocumentBuilder db = null; private static Document document = null; static{ try { dbFactory = DocumentBuilderFactory.newInstance(); db = dbFactory.newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); } } public Map<String,List<String>> getMethods(String fileName) throws SAXException, IOException{ Map<String,List<String>> classes = new HashMap<String, List<String>>();document = db.parse(fileName); NodeList nList = document.getElementsByTagName("class");for(int i = 0 ; i<nList.getLength();i++){ Node node = nList.item(i); Element ele = (Element)node; if(node.getNodeType() == Element.ELEMENT_NODE){String clazz = ele.getAttribute("name"); List<String> methods = new ArrayList<String>();String method = ele.getElementsByTagName("method").item(0).getTextContent();methods.add(method);classes.put(clazz, methods); }}return classes;} public Map<String,List<String>> getJars(String fileName) throws SAXException, IOException{ Map<String,List<String>> classes = new HashMap<String, List<String>>();document = db.parse(fileName); NodeList nList = document.getElementsByTagName("class");for(int i = 0 ; i<nList.getLength();i++){ Node node = nList.item(i); Element ele = (Element)node; if(node.getNodeType() == Element.ELEMENT_NODE){String clazz = ele.getAttribute("name"); List<String> jars = new ArrayList<String>();String jar = ele.getElementsByTagName("jar").item(0).getTextContent();jars.add(jar);classes.put(clazz, jars); }}return classes;} }4、動態加載jar包工具類: package cn.fjs;import java.io.File; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.List;public final class JarLoaderUtil {/** URLClassLoader的addURL方法 */ private static Method addURL = initAddMethod(); /** 初始化方法 */ private static final Method initAddMethod() { try { Method add = URLClassLoader.class .getDeclaredMethod("addURL", new Class[] { URL.class }); add.setAccessible(true); return add; } catch (Exception e) { e.printStackTrace(); } return null; } private static URLClassLoader system = (URLClassLoader) ClassLoader.getSystemClassLoader(); /** * 循環遍歷目錄,找出所有的JAR包 */ private static final void loopFiles(File file, List<File> files) { if (file.isDirectory()) { File[] tmps = file.listFiles(); for (File tmp : tmps) { loopFiles(tmp, files); } } else { if (file.getAbsolutePath().endsWith(".jar") || file.getAbsolutePath().endsWith(".zip")) { files.add(file); } } } /** * <pre> * 加載JAR文件 * </pre> * * @param file */ public static final void loadJarFile(File file) { try { addURL.invoke(system, new Object[] { file.toURI().toURL() }); //System.out.println("加載JAR包:" + file.getAbsolutePath()); } catch (Exception e) { e.printStackTrace(); } } /** * <pre> * 從一個目錄加載所有JAR文件 * </pre> * * @param path */ public static final void loadJarPath(String path) { List<File> files = new ArrayList<File>(); File lib = new File(path); loopFiles(lib, files); for (File file : files) { loadJarFile(file); } } }
參考:http://blog.csdn.net/fjssharpsword/article/details/64905874
URLClassLoader也可以動態加載jar包的類并執行具體方法。
總結
以上是生活随笔為你收集整理的Java运行时动态加载类之ClassLoader加载class及其依赖jar包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java运行时动态加载类之ClassLo
- 下一篇: 【正一专栏】里皮神奇不再,国足梦断伊朗魔