/**
* ClassLoaderUtil
*
* @author kq
* @date 2019-01-19
*/
public class ClassLoaderUtil {
protected static Logger logger = LoggerFactory.getLogger(ClassLoaderUtil.class);
public static ClassLoader getClassLoader(Class<?> clazz) {
ClassLoader cl = null;
try {
cl = Thread.currentThread().getContextClassLoader();
} catch (Throwable ex) {
// Cannot access thread context ClassLoader - falling back to system class loader...
}
if (cl == null) {
// No thread context class loader -> use class loader of this class.
cl = clazz.getClassLoader();
if (cl == null) {
// getClassLoader() returning null indicates the bootstrap ClassLoader
try {
cl = ClassLoader.getSystemClassLoader();
} catch (Throwable ex) {
// Cannot access system ClassLoader - oh well, maybe the caller can live with null...
}
}
}
return cl;
}
private static ClassLoader findClassLoader() {
return getClassLoader(ClassLoaderUtil.class);
}
private void loadDirectory(Map<String, Class<?>> extensionClasses, String dir, String type) {
String fileName = dir + type;
try {
Enumeration<URL> urls; // 从类记载器 得到文件 比如: META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.RouterFactory
ClassLoader classLoader = findClassLoader();
if (classLoader != null) {
urls = classLoader.getResources(fileName);
} else {
urls = ClassLoader.getSystemResources(fileName);
}
if (urls != null) {
while (urls.hasMoreElements()) {
java.net.URL resourceURL = urls.nextElement();
logger.info("resourceURL={}",resourceURL);
loadResource(extensionClasses, classLoader, resourceURL);
}
}
} catch (Throwable t) {
logger.error("Exception occurred when loading extension class (interface: " +
type + ", description file: " + fileName + ").", t);
}
}
// 1.读取资源文件中的内容,一行一行读取 2. 得到每行的key value 3. 缓存类 (解析META-INF/dubbo/internal下文件 key value)
private void loadResource(Map<String, Class<?>> extensionClasses, ClassLoader classLoader, java.net.URL resourceURL) {
try {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(resourceURL.openStream(), StandardCharsets.UTF_8))) {
String line; //比如: line: adaptive=org.apache.dubbo.common.extension.factory.AdaptiveExtensionFactory
while ((line = reader.readLine()) != null) { //line: spi=org.apache.dubbo.common.extension.factory.SpiExtensionFactory
logger.info("readLine={}",line);
}
}
} catch (Throwable t) {
logger.error("Exception occurred when loading extension class (interface: " +
", class file: " + resourceURL + ") in " + resourceURL, t);
}
}
public static void printParentClassLoader(Class clazz) {
ClassLoader cl = clazz.getClassLoader();
System.out.println("classLoader="+cl);
while (cl!=null) {
cl = cl.getParent();
System.out.println("classLoader="+cl);
}
}
public static void main(String[] args) {
Map<String, Class<?>> map = new HashMap<>();
new ClassLoaderUtil().loadDirectory(map,"META-INF/dubbo/internal/","org.apache.dubbo.common.extension.ExtensionFactory");
System.out.println("map="+map);
}
}
读取jar包中的文件
猜你喜欢
转载自blog.csdn.net/kq1983/article/details/103156527
今日推荐
周排行