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"

  • 相关阅读:
    Django Admin 管理工具
    老男孩培训机构老师的博客
    pycharm版本选择并安装
    Linux命令-自动挂载文件/etc/fstab功能详解
    django urls路由匹配分发
    django templates模板
    Django models模型
    django views视图函数
    JDK与JRE、JVM三者间的关系及JDK的安装部署
    django 第一个项目测试
  • 原文地址:https://www.cnblogs.com/zhangyan-2015/p/6062805.html
Copyright © 2011-2022 走看看