1. 程式人生 > >Java運行時動態加載類之ClassLoader

Java運行時動態加載類之ClassLoader

filename 解析 extend ssl aos file cat classes fig

https://blog.csdn.net/fjssharpsword/article/details/64922083

***************************************************************************

需求場景:動態加載類ClassLoaderd,在xml文件中配置加載類名稱和方法,:

一、準備

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)要動態加載的類:

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 ..."); } }

對這兩個類進行編譯後,將class文件復制到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") @Override protected 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 block
            e.printStackTrace();
        }
    }
}

執行結果:

 hello ...
1+1=2

Java運行時動態加載類之ClassLoader