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()
{
}