java中如何判断类的重复加载
来源:互联网 发布:数据对比用什么图表 编辑:程序博客网 时间:2024/04/30 08:13
这几天在看dubbo的源码,看到里面有一个方法是检测类的重复加载的,感觉挺实用的,写下来,防备自己忘记
package com.test;import java.net.URL;import java.util.Enumeration;import java.util.HashSet;import java.util.Set;public class VersionTest {public void checkDuplicate(String path, boolean failOnError){try {// 在ClassPath搜文件Enumeration<URL> urls = VersionTest.class.getClassLoader().getResources(path);Set<String> files = new HashSet<String>();while (urls.hasMoreElements()) {URL url = urls.nextElement();if (url != null) {String file = url.getFile();if (file != null && file.length() > 0) {files.add(file);}}}// 如果有多个,就表示重复if (files.size() > 1) { String error = "Duplicate class " + path + " in " + files.size() + " jar " + files; if (failOnError) { throw new IllegalStateException(error); } else { System.out.println(error); }}} catch (Throwable e) { // 防御性容错e.printStackTrace();}}//获取版本号 public static String getVersion(Class<?> cls, String defaultVersion) { try { // 首先查找MANIFEST.MF规范中的版本号 String version = cls.getPackage().getImplementationVersion(); if (version == null || version.length() == 0) { version = cls.getPackage().getSpecificationVersion(); } if (version == null || version.length() == 0) { // 如果规范中没有版本号,基于jar包名获取版本号 CodeSource codeSource = cls.getProtectionDomain().getCodeSource(); if(codeSource == null) { logger.info("No codeSource for class " + cls.getName() + " when getVersion, use default version " + defaultVersion); } else { String file = codeSource.getLocation().getFile(); if (file != null && file.length() > 0 && file.endsWith(".jar")) { file = file.substring(0, file.length() - 4); int i = file.lastIndexOf('/'); if (i >= 0) { file = file.substring(i + 1); } i = file.indexOf("-"); if (i >= 0) { file = file.substring(i + 1); } while (file.length() > 0 && ! Character.isDigit(file.charAt(0))) { i = file.indexOf("-"); if (i >= 0) { file = file.substring(i + 1); } else { break; } } version = file; } } } // 返回版本号,如果为空返回缺省版本号 return version == null || version.length() == 0 ? defaultVersion : version; } catch (Throwable e) { // 防御性容错 // 忽略异常,返回缺省版本号 logger.error("return default version, ignore exception " + e.getMessage(), e); return defaultVersion; } }public static void main(String[] args) {new VersionTest().checkDuplicate("com/spring/schema/spring_schema/entity/People.class",false);}}
输出的结果为:
Duplicate class com/spring/schema/spring_schema/entity/People.class in 2 jar [file:/D:/workspacelianxi/spring-schema/src/spring-schema-0.0.1-SNAPSHOT.jar!/com/spring/schema/spring_schema/entity/People.class, /D:/workspacelianxi/spring-schema/target/classes/com/spring/schema/spring_schema/entity/People.class]
0 0
- java中如何判断类的重复加载
- JAVA基础之——HashSet中是如何判断元素是否重复的
- HashSet中是如何判断元素是否重复的
- 如何判断Oracle中某个字段的值是否重复
- HashSet中是如何判断元素是否重复的
- HashSet中是如何判断元素是否重复的
- HashSet中是如何判断元素是否重复的
- Java 判断数组中唯一一个不重复的数字,其它数字重复两次
- java中如何去掉list中重复的对象
- java中如何创建自己的类加载器详解
- Java判断List中有无重复元素
- 对于java中如何去除重复的数据
- Java中如何去除List中的重复的值?
- 如何判断主键重复
- mysql中如何判断指定字段的重复数据则不插入?
- java中的Map判断重复的方法
- JAVA HashSet 的 判断重复 问题
- 动态加载JS过程中如何判断JS加载完成
- DES算法详解和代码 - IP置换
- 酷友观点/经验:UI设计师不可不知的安卓屏幕知识(原创文章)
- 编程练习2----字符串操作(重复字符检查)
- The JAVA_HOME environment variable does not point to a working 32-bit JDK or JRE.
- UI_霓虹灯
- java中如何判断类的重复加载
- iOS存储的几种方式
- 财富赢家模拟炒股最新版分享,股市小散的利器
- 欢迎使用CSDN-markdown编辑器
- 拦截聊天记录--Hook技巧简介
- 记录一次linux错误的修复(linux启动出现UNEXPECTED INCONSISTENCY;RUN fsck MANUALLY)
- 快速排序
- 4个易打动人的营销技巧
- 游戏新手引导的演进版