java 使用ClassLoader动态加载jar,zip文件

java ClassLoader的使用

public class Main {
    public static void main(String[] args) {
        
        URL[] urls = new URL[] {};
        MyClassLoader classLoader = new MyClassLoader(urls, null);
        String path = "E:/WorkSpace/MapSDKLibrary/libs/commons-codec-1.6.jar";
        try {
            classLoader.addJar(new File(path).toURI().toURL());
            Class<?> clazz = classLoader.loadClass("org.apache.commons.codec.digest.DigestUtils");
            Method md5Method = clazz.getDeclaredMethod("md5Hex",byte[].class);
            Object returnValue = md5Method.invoke(null, "hello world".getBytes("utf-8"));
            System.out.println("length="+returnValue.toString().length()+",result="+returnValue.toString());
            classLoader.close();
            
            /**
            ClassLoader cl = new URLClassLoader(new URL[]{new File(path).toURI().toURL()});
            Class<?> clazz2 = classLoader.loadClass("org.apache.commons.codec.digest.DigestUtils");
            Method md5Method2 = clazz.getDeclaredMethod("md5Hex",byte[].class);
            Object returnValue2 = md5Method.invoke(clazz2.newInstance(), "hello world".getBytes("utf-8"));
            System.out.println("length="+returnValue2.toString().length()+",result="+returnValue2.toString());
           **/
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    static class MyClassLoader extends URLClassLoader {

        public MyClassLoader(URL[] urls) {
            super(urls);
        }

        public MyClassLoader(URL[] urls, ClassLoader parent) {
            super(urls, parent);
        }

        public void addJar(URL url) {
            this.addURL(url);
        }

    }

}

这里我们给出一个比较好的类加载工具

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.List;

public class ClassUtil
{

    public static final String ARRAY_SUFFIX = "[]";

    public static final Class EMPTY_CLASS_ARRAY[] = new Class[0];

    private static final char INNER_CLASS_SEPARATOR_CHAR = 36;

    private static final char PACKAGE_SEPARATOR_CHAR = 46;

    private static Class PRIMITIVE_CLASSES[];

    static 
    {
        PRIMITIVE_CLASSES = (new Class[] {
            Boolean.TYPE, Byte.TYPE, Character.TYPE, Short.TYPE, Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE
        });
    }

    public static String addResourcePathToPackagePath(Class clazz, String resourceName)
    {
        if(!resourceName.startsWith("/"))
            return (new StringBuilder()).append(classPackageAsResourcePath(clazz)).append("/").append(resourceName).toString();
        else
            return (new StringBuilder()).append(classPackageAsResourcePath(clazz)).append(resourceName).toString();
    }

    public static String classPackageAsResourcePath(Class clazz)
    {
        if(clazz == null || clazz.getPackage() == null)
            return "";
        else
            return clazz.getPackage().getName().replace('.', '/');
    }

    private static List getAllInterfacesExclude(Class clazz, String itfNames[], List list)
    {
        if(list == null)
            list = new ArrayList();
        if(clazz != null)
        {
            Class interfaces[] = clazz.getInterfaces();
            for(int i = 0; i < interfaces.length; i++)
            {
                boolean needAdded = true;
                if(list.contains(interfaces[i]))
                    continue;
                if(itfNames != null)
                {
                    for(int j = 0; j < itfNames.length && needAdded; j++)
                    {
                        if(!interfaces[i].getName().startsWith(itfNames[j]))
                            continue;
                        if(clazz.isInterface())
                            list.remove(clazz);
                        needAdded = false;
                    }

                }
                if(needAdded)
                {
                    list.add(interfaces[i]);
                    getAllInterfacesExclude(interfaces[i], itfNames, list);
                }
            }

            clazz = clazz.getSuperclass();
            getAllInterfacesExclude(clazz, itfNames, list);
        }
        return list;
    }

    public static Constructor getConstructor(Class clz, Class expectedTypes[])
    {
        Constructor constructor = null;
        try
        {
            Constructor constructors[] = clz.getConstructors();
            for(int i = 0; i < constructors.length; i++)
            {
                Constructor creator = constructors[i];
                if(isAssignable(expectedTypes, creator.getParameterTypes()))
                    if(constructor == null)
                        constructor = creator;
                    else
                    if(isAssignable(creator.getParameterTypes(), constructor.getParameterTypes()))
                        constructor = creator;
            }

        }
        catch(Throwable thr)
        {
            String msg = (new StringBuilder()).append("Class: ").append(clz.getName()).append(", ").append(clz.getProtectionDomain().getCodeSource().getLocation()).append(", ").append(clz.getClassLoader()).toString();
            throw new RuntimeException(msg, thr);
        }
        return constructor;
    }

    public static ClassLoader getContextClassLoader()
    {
        return (ClassLoader)AccessController.doPrivileged(new PrivilegedAction() {

            public ClassLoader run()
            {
                return Thread.currentThread().getContextClassLoader();
            }

        });
    }

    public static Class[] getInterfaces(Class clazz)
    {
        List interfaces = new ArrayList();
        interfaces = getAllInterfacesExclude(clazz, null, interfaces);
        return (Class[])(Class[])interfaces.toArray(new Class[interfaces.size()]);
    }

    public static Class[] getInterfaces(Class clazz, String excludes[])
    {
        List interfaces = new ArrayList();
        interfaces = getAllInterfacesExclude(clazz, excludes, interfaces);
        return (Class[])(Class[])interfaces.toArray(new Class[interfaces.size()]);
    }

    public static Method getMethod(Class clz, String methodName, Class expectedTypes[])
        throws NoSuchMethodException
    {
        Method method = null;
        try
        {
            method = clz.getMethod(methodName, expectedTypes);
        }
        catch(NoSuchMethodException e)
        {
            Method methods[] = clz.getMethods();
            for(int i = 0; i < methods.length; i++)
            {
                Method _method = methods[i];
                if(!_method.getName().equals(methodName) || !isAssignable(expectedTypes, _method.getParameterTypes()))
                    continue;
                if(method == null)
                {
                    method = _method;
                    continue;
                }
                if(isAssignable(_method.getParameterTypes(), method.getParameterTypes()))
                    method = _method;
            }

            if(method == null)
                throw e;
        }
        return method;
    }

    public static String getShortName(Class clazz)
    {
        return getShortName(clazz.getName());
    }

    public static String getShortName(String className)
    {
        char charArray[] = className.toCharArray();
        int lastDot = 0;
        for(int i = 0; i < charArray.length; i++)
        {
            if(charArray[i] == '.')
            {
                lastDot = i + 1;
                continue;
            }
            if(charArray[i] == '$')
                charArray[i] = '.';
        }

        return new String(charArray, lastDot, charArray.length - lastDot);
    }

    public static Method getStaticMethod(Class clazz, String methodName, Class args[])
    {
        try
        {
            Method method = clazz.getDeclaredMethod(methodName, args);
            if((method.getModifiers() & 8) != 0)
                return method;
        }
        catch(NoSuchMethodException ex) { }
        return null;
    }

    public static boolean hasAtLeastOneMethodWithName(Class clazz, String methodName)
    {
        do
        {
            for(int i = 0; i < clazz.getDeclaredMethods().length; i++)
            {
                Method method = clazz.getDeclaredMethods()[i];
                if(methodName.equals(method.getName()))
                    return true;
            }

            clazz = clazz.getSuperclass();
        } while(clazz != null);
        return false;
    }
    public static boolean isAssignable(Class cls, Class toClass)
    {
        if(toClass == null)
            return false;
        if(cls == null)
            return !toClass.isPrimitive();
        if(cls.equals(toClass))
            return true;
        if(cls.isPrimitive())
        {
            if(!toClass.isPrimitive())
                return false;
            if(Integer.TYPE.equals(cls))
                return Long.TYPE.equals(toClass) || Float.TYPE.equals(toClass) || Double.TYPE.equals(toClass);
            if(Long.TYPE.equals(cls))
                return Float.TYPE.equals(toClass) || Double.TYPE.equals(toClass);
            if(Boolean.TYPE.equals(cls))
                return false;
            if(Double.TYPE.equals(cls))
                return false;
            if(Float.TYPE.equals(cls))
                return Double.TYPE.equals(toClass);
            if(Character.TYPE.equals(cls))
                return Integer.TYPE.equals(toClass) || Long.TYPE.equals(toClass) || Float.TYPE.equals(toClass) || Double.TYPE.equals(toClass);
            if(Short.TYPE.equals(cls))
                return Integer.TYPE.equals(toClass) || Long.TYPE.equals(toClass) || Float.TYPE.equals(toClass) || Double.TYPE.equals(toClass);
            if(Byte.TYPE.equals(cls))
                return Short.TYPE.equals(toClass) || Integer.TYPE.equals(toClass) || Long.TYPE.equals(toClass) || Float.TYPE.equals(toClass) || Double.TYPE.equals(toClass);
            else
                return false;
        } else
        {
            return toClass.isAssignableFrom(cls);
        }
    }
    public static boolean isAssignable(Class classArray[], Class toClassArray[])
    {
        if(classArray.length != toClassArray.length)
            return false;
        if(classArray == null)
            classArray = EMPTY_CLASS_ARRAY;
        if(toClassArray == null)
            toClassArray = EMPTY_CLASS_ARRAY;
        for(int i = 0; i < classArray.length; i++)
            if(!isAssignable(classArray[i], toClassArray[i]))
                return false;

        return true;
    }
    public static boolean isAssignableFrom(Class original, Class checkedClasses[])
    {
        if(checkedClasses == null)
            return false;
        for(int i = 0; i < checkedClasses.length; i++)
            if(original.isAssignableFrom(checkedClasses[i]))
                return true;

        return false;
    }
    public static Class loadClass(final String name)
        throws ClassNotFoundException
    {
        if(name.length() <= 8)
        {
            for(int i = 0; i < PRIMITIVE_CLASSES.length; i++)
            {
                Class clazz = PRIMITIVE_CLASSES[i];
                if(clazz.getName().equals(name))
                    return clazz;
            }

        }
        if(name.endsWith("[]"))
        {
            String elementClassName = name.substring(0, name.length() - "[]".length());
            Class elementClass = loadClass(elementClassName);
            return Array.newInstance(elementClass, 0).getClass();
        }
        Class result = null;
        try
        {
            result = Class.forName(name);
            if(result != null)
            {
            	return result;
            }
        }
        catch(ClassNotFoundException e) { 
        	
        }
        
        Object obj = AccessController.doPrivileged(new PrivilegedAction() {

        	@Override
        	public Object run()
            {
                ClassLoader threadCL = ClassUtil.getContextClassLoader();
                if(threadCL != null)
                    try
                    {
                        return threadCL.loadClass(name);
                    }
                    catch(ClassNotFoundException ex)
                    {
                        return ex;
                    }
                else
                    return null;
            }

        });
        if(obj instanceof Class)
            return (Class)obj;
        else
            throw new ClassNotFoundException("Not Found the class which name of"+name);
    }

    public ClassUtil()
    {
    }


转载于:https://my.oschina.net/ososchina/blog/352008

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值