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"

  • 相关阅读:
    单工-半双工-双工
    为你的Windows7设置动态壁纸
    Vmware为Ubuntu安装VmTools
    CodeBlocks集成cppcheck
    自定义鼠标右键(层叠式菜单:cascading menu)
    Hao123这个流氓
    Android的ADT内容助手快捷方式设置
    安装Google框架服务并突破Google Play下载限制
    Windows7下CHM电子书打开不能正常显示内容
    谷歌首页背景设置
  • 原文地址:https://www.cnblogs.com/zhangyan-2015/p/6062805.html
Copyright © 2011-2022 走看看