判断ClassLoader下的某个类是否有重复[转自梁飞]
import java.net.URL;import java.util.*;public class etst { public static void checkDuplicate(Class cls) { checkDuplicate(cls.getName().replace('.', '/') + ".class"); } public static void checkDuplicateByName(String className) { System.err.println("checkDuplicate"); checkDuplicate(className.replace('.', '/') + ".class"); } public static void checkDuplicate(String path) { try { // 在ClassPath搜文件 System.err.println("checkDuplicate"); Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources( path); Set files = new HashSet(); while (urls.hasMoreElements()) { URL url = urls.nextElement(); if (url != null) { String file = url.getFile(); if (file != null && file.length() > 0) { System.err.println("Duplicate class " + path + " in " + files.size() + " jar " + url); files.add(file); } } } // 如果有多个,就表示重复 if (files.size() > 1) { System.err.println("Duplicate class " + path + " in " + files.size() + " jar " + files); } } catch (Throwable e) { // 防御性容错 System.err.println(e.getMessage()); } } public static void main(String[] args){ checkDuplicateByName("java.lang.String"); }}
?
输出结果:
checkDuplicate
checkDuplicate
Duplicate class java/lang/String.class in 0 jar jar:file:/usr/lib/jvm/java-6-sun-1.6.0.24/jre/lib/rt.jar!/java/lang/String.class