1. package com.lms.db.driver;
    2. import java.io.File;
    3. import java.lang.reflect.Method;
    4. import java.net.MalformedURLException;
    5. import java.net.URL;
    6. import java.net.URLClassLoader;
    7. import java.util.ArrayList;
    8. import java.util.List;
    9. /**
    10. * @description: 使用URLClassLoader加载
    11. * @author: pp_lan
    12. * @date: 2022/3/17
    13. */
    14. public class UrlExternalClasspathLoader {
    15. private final URLClassLoader urlClassLoader;
    16. /**
    17. * 构造方法
    18. * @param file jar所在的路径,或者单个jar的全路径
    19. */
    20. public UrlExternalClasspathLoader(File file,ClassLoader parent) throws Exception {
    21. List<URL> urlList = new ArrayList<>();
    22. if (file.isDirectory()) {
    23. addUrl(urlList, file);
    24. } else {
    25. addJar(urlList, file);
    26. }
    27. URL[] urls = urlList.toArray(new URL[]{});
    28. urlClassLoader = new URLClassLoader(urls,parent);
    29. }
    30. public UrlExternalClasspathLoader(File file) throws Exception {
    31. List<URL> urlList = new ArrayList<>();
    32. if (file.isDirectory()) {
    33. addUrl(urlList, file);
    34. } else {
    35. addJar(urlList, file);
    36. }
    37. URL[] urls = urlList.toArray(new URL[]{});
    38. urlClassLoader = new URLClassLoader(urls);
    39. }
    40. public void init() {
    41. }
    42. /**
    43. * 加载class
    44. * @param name
    45. * @return
    46. * @throws ClassNotFoundException
    47. */
    48. public Class<?> loadClass(String name) throws ClassNotFoundException {
    49. return this.urlClassLoader.loadClass(name);
    50. }
    51. /**
    52. * 加载路径
    53. * @param urlList
    54. * @param file
    55. */
    56. private void addUrl(List<URL> urlList, File file) throws Exception {
    57. File[] subFiles = file.listFiles();
    58. if (subFiles != null) {
    59. for (File subFile : subFiles) {
    60. if (subFile.isDirectory()) {
    61. addUrl(urlList, subFile);
    62. } else {
    63. addJar(urlList, subFile);
    64. }
    65. }
    66. }
    67. }
    68. /**
    69. * 加载jar
    70. * @param urlList
    71. * @param subFile
    72. */
    73. private void addJar(List<URL> urlList, File subFile) throws Exception {
    74. try {
    75. if (subFile.getAbsolutePath().endsWith(".jar")) {
    76. urlList.add(subFile.toURI().toURL());
    77. }
    78. } catch (MalformedURLException e) {
    79. throw new Exception("加载JAR异常");
    80. }
    81. }
    82. public static void main(String[] args) throws Exception {
    83. System.out.println("开始");
    84. UrlExternalClasspathLoader classLoader1 = new UrlExternalClasspathLoader(new File("D:\\idea_workspace\\1-tool\\db-driver-manager\\src\\main\\resources\\driver\\dm\\Dm7JdbcDriver.jar"),null);
    85. UrlExternalClasspathLoader classLoader2 = new UrlExternalClasspathLoader(new File("D:\\idea_workspace\\1-tool\\db-driver-manager\\src\\main\\resources\\driver\\dm\\DmJdbcDriver.jar"),null);
    86. try {
    87. Class<?> aClass1 = classLoader1.loadClass("dm.jdbc.driver.DmDriver");
    88. Object o = aClass1.newInstance();
    89. System.out.println(o);
    90. Class<?> aClass2 = classLoader2.loadClass("dm.jdbc.driver.DmDriver");
    91. Object o2 = aClass2.newInstance();
    92. System.out.println(o2);
    93. } catch (Exception e) {
    94. e.printStackTrace();
    95. }
    96. }
    97. }