Java运行时动态加载类之ClassLoader
生活随笔
收集整理的這篇文章主要介紹了
Java运行时动态加载类之ClassLoader
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
需求場景:動(dòng)態(tài)加載類ClassLoaderd,在xml文件中配置加載類名稱和方法,:
一、準(zhǔn)備
1)在D:\\tmp\\目錄下配置a.xml文件:
<?xml version="1.0" encoding="ISO-8859-1"?> <classes><class name="User"> <method>say</method> </class> <class name="map"> <method>add</method> </class> </classes>2)要?jiǎng)討B(tài)加載的類: package dx;public class map {public void add(){System.out.println("1+1=2");} }
package cn.fjs;public class User {public void say(){System.out.println(" hello ...");}}
對這兩個(gè)類進(jìn)行編譯后,將class文件復(fù)制到D:\\tmp\\路徑下。
二、參考代碼如下
1、重載ClassLoader類:
package cn.fjs;import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream;public class DynamicClassLoader extends ClassLoader{private static final String SUFFIX = ".class";public String[] paths;public DynamicClassLoader(String[] paths) {this.paths = paths;}public DynamicClassLoader(ClassLoader parent,String[] paths){super(parent);this.paths = paths;}@SuppressWarnings("deprecation")@Overrideprotected Class<?> findClass(String className) throws ClassNotFoundException { String classPath = getClassPath(className);if(classPath != null){byte[] clazz = loadClazz(classPath);return defineClass(clazz, 0, clazz.length); }else{System.out.println("class is not found !");return null;}}public byte[] loadClazz(String classPath) { try { FileInputStream in = new FileInputStream(new File(classPath));ByteArrayOutputStream baos = new ByteArrayOutputStream();int b;while((b = in.read()) != -1){baos.write(b);}in.close();return baos.toByteArray();} catch (Exception e) {System.out.println(e);}return null;}public String getClassPath(String className){for(String path : paths){if(className.contains(".")){className = className.replaceAll(".", File.separator);}String classPath = path + className + SUFFIX; File classFile = new File(classPath);if(classFile.exists()){return classPath;}}return null;} }2、解析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;} }
3、測試類: package cn.fjs;import java.util.List; import java.util.Map; import cn.fjs.DynamicClassLoader; import cn.fjs.DynamicDom;public class DynamicClassLoaderTest {public static void main(String[] args) {DynamicDom dmo = new DynamicDom();//xml文件解析類Map<String, List<String>> classes;//重載ClassLoader類DynamicClassLoader loader = new DynamicClassLoader(new String[]{"D:\\tmp\\"}); try {classes = dmo.getMethods("D:\\tmp\\a.xml");for(String key:classes.keySet()){ for(String clazz : classes.get(key)){ Class<?> c =loader.findClass(key);//類名字c.getMethod(clazz).invoke(c.newInstance());//方法名字}} }catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}} }
總結(jié)
以上是生活随笔為你收集整理的Java运行时动态加载类之ClassLoader的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hive表路径修改和分区表数据加载命令
- 下一篇: Java运行时动态加载类之ClassLo