zoukankan      html  css  js  c++  java
  • 动态加载jar包中的类(方式一)

    嘛, 直接上代码

      public static class TestClassLoader extends ClassLoader {
            @Override
            protected Class<?> loadClass(String className, boolean resolve) throws ClassNotFoundException {
                if (className.startsWith("com.squareup.okhttp")) {
                    return loadOkHttp(className);
                }
                return super.loadClass(className, resolve);
            }
    
            private Class<?> loadOkHttp(String className) throws ClassNotFoundException {
                String jarPathstr = "";
                String jarPathstr2 = "";
                StringBuilder sb = new StringBuilder();
                sb.append(System.getProperty("user.dir"))
                        .append(File.separator).append("doc").append(File.separator)
                        .append("jar").append(File.separator);
                jarPathstr = sb.toString() + "okhttp-1.2.1.jar";
                jarPathstr2 = sb.toString() + "okhttp-protocols-1.2.1.jar";
                InputStream inputStream = null;
                byte[] clazzs = null;
                try {
                    JarFile jarFile = new JarFile(jarPathstr);
                    String path = className.replaceAll("\.", "/") + ".class";
                    JarEntry entry = jarFile.getJarEntry(path);
                    if (entry == null) {
                        jarFile = new JarFile(jarPathstr2);
                        entry = jarFile.getJarEntry(path);
                    }
                    if (entry == null) {
                        throw new ClassNotFoundException(className + " Not Found!!");
                    }
    
                    inputStream = jarFile.getInputStream(entry);
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    byte[] buff = new byte[1024];
                    int len = 0;
                    while ((len = inputStream.read(buff)) != -1) {
                        baos.write(buff, 0, len);
                    }
                    baos.close();
                    clazzs = baos.toByteArray();
                } catch (IOException e) {
    
                } finally {
                    Util.close(inputStream);
                }
    
                return defineClass(className, clazzs, 0, clazzs.length);
            }
    
        }

    这个类加载器的作用是, 如果加载的类前缀为 com.squareup.okhttp, 那么就重项目的根目录的doc/jar/下的okhttp-1.2.1.jar和okhttp-protocols-1.2.1.jar中去加载。

     注意jar包是一个归档文件, 里面的实例名称是这样的

    所以类名className对应的实例名为 className.replaceAll("\.", "/") + ".class"

  • 相关阅读:
    对数损失函数(Logarithmic Loss Function)的原理和 Python 实现
    ffmpeg 简介及使用
    数据预处理(Python scikit-learn)
    检查 NaN 数据值 (C/C++/Python 实现)
    数据正规化 (data normalization) 的原理及实现 (Python sklearn)
    matplotlib.pyplot 导引
    在 O(1) 时间删除链表结点(C 和 Python 实现)
    安装 Python IDLE (Linux)
    打印 1 到最大的 n 位数(C++ 和 Python 实现)
    七种RAID技术
  • 原文地址:https://www.cnblogs.com/zhangyan-2015/p/6062805.html
Copyright © 2011-2022 走看看