需求场景是:通过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包相关推荐

  1. 【java】Java运行时动态生成类几种方式

    1.概述 转载:Java运行时动态生成类几种方式 这里发现自己不知道的,原来Java 还能自己编译自己,学到了. 最近一个项目中利用规则引擎,提供用户拖拽式的灵活定义规则.这就要求根据数据库数据动态生 ...

  2. Java运行时动态加载类之URLClassLoader

    需求场景:通过URLClassLoader从jar文件中加载类并创建实例,可实现运行时动态加载 1.要加载的jar: 1)接口类IC package cn.fjs;public interface I ...

  3. Java运行时动态加载类之ClassLoader

    需求场景:动态加载类ClassLoaderd,在xml文件中配置加载类名称和方法,: 一.准备 1)在D:\\tmp\\目录下配置a.xml文件: <?xml version="1.0 ...

  4. Java运行时动态加载类之Class.forName

    需求场景:通过Class.forName加载类并创建实例. 1.接口类: package cn.fjs;public interface IC {public void action(); } 2.实 ...

  5. Java运行时动态加载类之ClassLoader方法带参数

    和该文环境一样http://blog.csdn.net/fjssharpsword/article/details/64922083 不同的是,在load出的class调用具体方法时传递参数. 1.U ...

  6. OpenRasp Java运行时修改字节码技术

    Java运行时修改字节码技术 Java运行时动态修改字节码技术,常用的有javassist asm来实现.不过最近在分析openrasp-java这块时,程序使用的javassist来动态插桩关键类, ...

  7. 动态生成java类_Java 运行时动态生成class

    Java是一门静态语言,通常,我们需要的class在编译的时候就已经生成了,为什么有时候我们还想在运行时动态生成class呢? 因为在有些时候,我们还真得在运行时为一个类动态创建子类.比如,编写一个O ...

  8. 【Java进阶】有哪些方法可以在运行时动态生成一个Java类?

    在开始今天的学习前,我建议你先复习一下专栏第 6 讲有关动态代理的内容.作为 Java 基础模块中的内容,考虑到不同基础的同学以及一个循序渐进的学习过程,我当时并没有在源码层面介绍动态代理的实现技术, ...

  9. JDK8版本JAVA运行错误:找不到或无法加载主类 HelloJava的原因及解决方案

    JDK8版本JAVA运行错误:找不到或无法加载主类 HelloJava的原因及解决方案 一.错误描述 二.编写HelloJava代码 三.在命令行CMD窗口中运行代码 四.错误原因分析 解决方案 注: ...

最新文章

  1. 比特币SPV节点启动流程图
  2. 《机器人爱好者(第2辑)》——《惑星历险》中的Robby
  3. SQL Server 2008如何进行数据库同步?
  4. HDU 4405 概率期望DP
  5. 双非硕士毕业4.5年晋级鹅厂T11之葵花宝典
  6. puts函数,C语言puts函数用法详解
  7. ES5-6 作用域、作用域链、预编译、闭包基础
  8. 在HTML中插入回车换行
  9. 怎样用调用资源管理器explore.exe打开指定的文件夹
  10. redis映射的概念_Redis存储总是心里没底?你大概漏了这些数据结构原理
  11. myeclipse堆栈溢出
  12. matlab字符串元胞数组,MATLAB字符串数组元胞数组和构架数组
  13. 机器学习笔记(一)——贝叶斯决策
  14. html视图查看,视图.html · zhaohaihang/Semantic UI demo - Gitee.com
  15. 对班级网站注册功能中密码输入运用等价类划分法设计测试用例
  16. win7电脑误删鼠标键盘驱动_快速恢复win7系统因驱动冲突导致鼠标键盘用不了的详细步骤...
  17. SSD硬盘,先不要用在Server上
  18. 中职中职计算机英语试题,中职英语试卷及参考答案
  19. 软件团队的模式-窝蜂模式
  20. 深度学习在计算机视觉领域图像应用总结

热门文章

  1. mysql事务隔离级别与设置
  2. 如何保存Tensorflow中的Tensor参数,保存训练中的中间参数,存储卷积层的数据
  3. [C#]关于Access的“INSERT INTO 语句的语法错误”问题
  4. IIS6、7添加反向代理的步骤
  5. Oracle Exception
  6. TYVJ 2002 扑克牌 题解
  7. [caffe]深度学习之图像分类模型VGG解读
  8. Java设计模式10:观察者模式
  9. AttachThreadInput
  10. android平台TP调试无法正常使用问题