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"

  • 相关阅读:
    什么是数据集
    Fastreport使用经验(转)在Delphi程序中访问报表对象
    多步操作产生错误,请检查每一步的状态值
    删除整个目录
    Win7下虚拟机个人使用小结:Virtual PC,VMware和VirtualBox
    Ribbon_窗体_实现Ribbon风格的窗体
    数学建模python matlab 编程(椭圆声学原理画图证明,解析几何)
    数学建模python matlab 编程(指派问题)
    matlab中如何给一个矩阵中的某几个特定位置赋值
    python matlab 带包实现全排列
  • 原文地址:https://www.cnblogs.com/zhangyan-2015/p/6062805.html
Copyright © 2011-2022 走看看