Java运行时动态加载类之ClassLoader
来源:互联网 发布:循环算法的时间复杂度 编辑:程序博客网 时间:2024/05/29 14:16
需求场景:动态加载类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")@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();}}}
hello ...1+1=2
0 0
- Java运行时动态加载类之ClassLoader
- Java运行时动态加载类之ClassLoader加载class及其依赖jar包
- Java运行时动态加载类之ClassLoader方法带参数
- java classLoader动态加载
- java classLoader动态加载
- Java运行时动态加载类之URLClassLoader
- Java运行时动态加载类之Class.forName
- Android之ClassLoader类加载器(MultiDex、动态加载dex)
- JAVA之了解类加载器Classloader
- java面试之ClassLoader类加载器
- Java类加载机制ClassLoader之ContextClassLoader
- Java类加载/ClassLoader
- Java 类加载Classloader
- Java类加载ClassLoader
- JAVA ClassLoader加载类
- linux下java虚拟机加载classloader动态类方法
- Java ClassLoader动态加载外部java代码
- Android动态加载之ClassLoader详解
- 我也要谈谈大型网站架构之系列(1)——纵观历史演变(上)
- javaweb面试必备知识点
- 我也要谈谈大型网站架构之系列(2)——纵观历史演变(下)
- 并行随笔(1)
- 吐槽一下Qt的按键消息响应
- Java运行时动态加载类之ClassLoader
- 我也要谈谈大型网站架构之系列(3)——死了都要说的缓存
- 什么是HTTP Headers?
- 我也要谈谈大型网站架构之系列(4)——分布式中的异步通信
- 挖一挖C#中那些我们不常用的东西之系列(4)——GetHashCode,ExpandoObject
- python爬虫之爬取捞月狗直播信息
- 挖一挖C#中那些我们不常用的东西之系列(5)——FlagAttribute
- 删边
- 跟着官方指南学习TensorFlow(序)