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包的类并执行具体方法。
5、测试类:
package cn.fjs;import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.List;
import java.util.Map;
import cn.fjs.DynamicClassLoader;
import cn.fjs.DynamicDom;public class DynamicClassLoaderTest {public static String FilePath="D:\\tmp\\";public static void main(String[] args) {DynamicDom dmo = new DynamicDom();//xml文件解析类Map<String, List<String>> classes;Map<String, List<String>> jars;try {//动态记载依赖包jars = dmo.getJars(FilePath+"a.xml");for(String key:jars.keySet()){for(String jar : jars.get(key)){JarLoaderUtil.loadJarFile(new File(FilePath+jar));}} //动态加载类DynamicClassLoader loader = new DynamicClassLoader(new String[]{FilePath});classes = dmo.getMethods(FilePath+"a.xml");for(String key:classes.keySet()){ for(String clazz : classes.get(key)){ Class<?> c =loader.findClass(key);//类名字//c.getMethod(clazz).invoke(c.newInstance());//方法名字c.getMethod(clazz,String.class).invoke(c.newInstance(),"fjs");//带参数}} }catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
Java运行时动态加载类之ClassLoader加载class及其依赖jar包相关推荐
- 【java】Java运行时动态生成类几种方式
1.概述 转载:Java运行时动态生成类几种方式 这里发现自己不知道的,原来Java 还能自己编译自己,学到了. 最近一个项目中利用规则引擎,提供用户拖拽式的灵活定义规则.这就要求根据数据库数据动态生 ...
- Java运行时动态加载类之URLClassLoader
需求场景:通过URLClassLoader从jar文件中加载类并创建实例,可实现运行时动态加载 1.要加载的jar: 1)接口类IC package cn.fjs;public interface I ...
- Java运行时动态加载类之ClassLoader
需求场景:动态加载类ClassLoaderd,在xml文件中配置加载类名称和方法,: 一.准备 1)在D:\\tmp\\目录下配置a.xml文件: <?xml version="1.0 ...
- Java运行时动态加载类之Class.forName
需求场景:通过Class.forName加载类并创建实例. 1.接口类: package cn.fjs;public interface IC {public void action(); } 2.实 ...
- Java运行时动态加载类之ClassLoader方法带参数
和该文环境一样http://blog.csdn.net/fjssharpsword/article/details/64922083 不同的是,在load出的class调用具体方法时传递参数. 1.U ...
- OpenRasp Java运行时修改字节码技术
Java运行时修改字节码技术 Java运行时动态修改字节码技术,常用的有javassist asm来实现.不过最近在分析openrasp-java这块时,程序使用的javassist来动态插桩关键类, ...
- 动态生成java类_Java 运行时动态生成class
Java是一门静态语言,通常,我们需要的class在编译的时候就已经生成了,为什么有时候我们还想在运行时动态生成class呢? 因为在有些时候,我们还真得在运行时为一个类动态创建子类.比如,编写一个O ...
- 【Java进阶】有哪些方法可以在运行时动态生成一个Java类?
在开始今天的学习前,我建议你先复习一下专栏第 6 讲有关动态代理的内容.作为 Java 基础模块中的内容,考虑到不同基础的同学以及一个循序渐进的学习过程,我当时并没有在源码层面介绍动态代理的实现技术, ...
- JDK8版本JAVA运行错误:找不到或无法加载主类 HelloJava的原因及解决方案
JDK8版本JAVA运行错误:找不到或无法加载主类 HelloJava的原因及解决方案 一.错误描述 二.编写HelloJava代码 三.在命令行CMD窗口中运行代码 四.错误原因分析 解决方案 注: ...
最新文章
- 比特币SPV节点启动流程图
- 《机器人爱好者(第2辑)》——《惑星历险》中的Robby
- SQL Server 2008如何进行数据库同步?
- HDU 4405 概率期望DP
- 双非硕士毕业4.5年晋级鹅厂T11之葵花宝典
- puts函数,C语言puts函数用法详解
- ES5-6 作用域、作用域链、预编译、闭包基础
- 在HTML中插入回车换行
- 怎样用调用资源管理器explore.exe打开指定的文件夹
- redis映射的概念_Redis存储总是心里没底?你大概漏了这些数据结构原理
- myeclipse堆栈溢出
- matlab字符串元胞数组,MATLAB字符串数组元胞数组和构架数组
- 机器学习笔记(一)——贝叶斯决策
- html视图查看,视图.html · zhaohaihang/Semantic UI demo - Gitee.com
- 对班级网站注册功能中密码输入运用等价类划分法设计测试用例
- win7电脑误删鼠标键盘驱动_快速恢复win7系统因驱动冲突导致鼠标键盘用不了的详细步骤...
- SSD硬盘,先不要用在Server上
- 中职中职计算机英语试题,中职英语试卷及参考答案
- 软件团队的模式-窝蜂模式
- 深度学习在计算机视觉领域图像应用总结