java动态加载jar包(推荐二)

该博客主要介绍了如何使用Java动态加载外部jar包中的类。通过`DriverUtil`类展示了如何打开jar文件,获取所有实现了`java.sql.Driver`接口的类,并使用`URLClassLoader`进行加载。关键方法包括`getDrivers`、`isDriver`和`getLoad`,适用于需要运行时动态加载类的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jar
  1. package com.bluedavid.util; 
  2.  
  3. import java.io.IOException;
  4. import java.net.MalformedURLException; 
  5. import java.net.URL; 
  6. import java.net.URLClassLoader; 
  7. import java.util.Enumeration; 
  8. import java.util.HashSet; 
  9. import java.util.Set; 
  10. import java.util.jar.JarEntry; 
  11. import java.util.jar.JarFile; 
  12.  
  13.  
  14. public class DriverUtil { 
  15.  
  16.   
  17. public static Set<String> getDrivers(String file) { 
  18.   JarFile jar = null
  19.   Set<String> set = new HashSet<String>(); 
  20.   try
  21.    jar = new JarFile(file); 
  22.   } catch (IOException e) { 
  23.    return null
  24.   } 
  25.   Enumeration<JarEntry> entries = jar.entries(); 
  26.    
  27.   URLClassLoader loader = getLoad(file); 
  28.   String name; 
  29.   while(entries.hasMoreElements()) { 
  30.    JarEntry entry = entries.nextElement(); 
  31.    if(entry.getName().endsWith("Driver.class")) { 
  32.     name = entry.getName(); 
  33.     name = name.substring(0, name.length() - 6); 
  34.     name = name.replaceAll("/", "."); 
  35.     Class<?> cc = null
  36.     try
  37.      cc = loader.loadClass(name); 
  38.     } catch (ClassNotFoundException e) { 
  39.      continue
  40.     } 
  41.     if(isDriver(cc)) 
  42.      set.add(name); 
  43.    } 
  44.   } 
  45.    
  46.    
  47.   return set; 
  48.   
  49.   
  50. public static boolean isDriver(Class<?> clazz) { 
  51.   Class<?>[] ccc = clazz.getInterfaces(); 
  52.   boolean flag = false
  53.   for(Class<?> aa : ccc) { 
  54.    if(aa.getName().equals("java.sql.Driver")) { 
  55.     flag = true
  56.    } 
  57.   } 
  58.   if(!flag) { 
  59.    for (; clazz != null; clazz = clazz.getSuperclass()) { 
  60.      Class<?>[] interfaces = clazz.getInterfaces(); 
  61.     for(Class<?> aa : interfaces) { 
  62.      if(aa.getName().equals("java.sql.Driver")) { 
  63.       flag = true
  64.      } 
  65.     } 
  66.    } 
  67.   } 
  68.   return flag; 
  69.   
  70.   
  71. public static URLClassLoader getLoad(String file) { 
  72.   URL[] url = null
  73.   try
  74.    url = new URL[]{new URL("file:" file)}; 
  75.   } catch (MalformedURLException e) { 
  76.    return null
  77.   } 
  78.   URLClassLoader loader = new URLClassLoader(url); 
  79.   return loader; 
  80.   
  81.   
  82. public static Class<?> getDynamic(String file, String clazz) { 
  83.   URLClassLoader loader = getLoad(file); 
  84.   try
  85.    return loader.loadClass(clazz); 
  86.   } catch (ClassNotFoundException e) { 
  87.    e.printStackTrace(); 
  88.   } 
  89.   return null
  90.   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值