package com.atom.util;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
/**
* <p>
* <a href="ClassLoaderUtils.java.html"><i>View Source</i></a>
* </p>
*
* @author KHT
* @version $Id: ClassLoaderUtils.java 9326 2008-10-07 03:44:39Z bai $
*/
public class ClassLoaderUtils {
/**
* Load a given resource.
* <p/>
* This method will try to load the resource using the following methods (in order):
* <ul>
* <li>From {@link Thread#getContextClassLoader() Thread.currentThread().getContextClassLoader()}
* <li>From {@link Class#getClassLoader() ClassLoaderUtil.class.getClassLoader()}
* <li>From the {@link Class#getClassLoader() callingClass.getClassLoader() }
* </ul>
*
* @param resourceName The name of the resource to load
* @param callingClass The Class object of the calling object
*/
@SuppressWarnings("unchecked")
public static URL getResource(String resourceName, Class callingClass) {
URL url = null;
url = Thread.currentThread().getContextClassLoader().getResource(resourceName);
if (url == null) {
url = ClassLoaderUtils.class.getClassLoader().getResource(resourceName);
}
if (url == null) {
url = callingClass.getClassLoader().getResource(resourceName);
}
return url;
}
/**
* This is a convenience method to load a resource as a stream.
* <p/>
* The algorithm used to find the resource is given in getResource()
*
* @param resourceName The name of the resource to load
* @param callingClass The Class object of the calling object
*/
@SuppressWarnings("unchecked")
public static InputStream getResourceAsStream(String resourceName, Class callingClass) {
URL url = getResource(resourceName, callingClass);
try {
return (url != null) ? url.openStream() : null;
} catch (IOException e) {
return null;
}
}
/**
* Load a class with a given name.
* <p/>
* It will try to load the class in the following order:
* <ul>
* <li>From {@link Thread#getContextClassLoader() Thread.currentThread().getContextClassLoader()}
* <li>Using the basic {@link Class#forName(java.lang.String) }
* <li>From {@link Class#getClassLoader() ClassLoaderUtil.class.getClassLoader()}
* <li>From the {@link Class#getClassLoader() callingClass.getClassLoader() }
* </ul>
*
* @param className The name of the class to load
* @param callingClass The Class object of the calling object
* @throws ClassNotFoundException If the class cannot be found anywhere.
*/
@SuppressWarnings("unchecked")
public static Class loadClass(String className, Class callingClass) throws ClassNotFoundException {
try {
return Thread.currentThread().getContextClassLoader().loadClass(className);
} catch (ClassNotFoundException e) {
try {
return Class.forName(className);
} catch (ClassNotFoundException ex) {
try {
return ClassLoaderUtils.class.getClassLoader().loadClass(className);
} catch (ClassNotFoundException exc) {
return callingClass.getClassLoader().loadClass(className);
}
}
}
}
/**
* Prints the current classloader hierarchy - useful for debugging.
*/
public static void printClassLoader() {
System.out.println("ClassLoaderUtils.printClassLoader");
printClassLoader(Thread.currentThread().getContextClassLoader());
}
/**
* Prints the classloader hierarchy from a given classloader - useful for debugging.
*/
public static void printClassLoader(ClassLoader cl) {
System.out.println("ClassLoaderUtils.printClassLoader(cl = " + cl + ")");
if (cl != null) {
printClassLoader(cl.getParent());
}
}
}
分享到:
相关推荐
类加载器的设计遵循双亲委派模型,它分为三个主要部分:启动类加载器、扩展类加载器和应用类加载器。 #### 二、类加载过程 类加载过程主要包括三个步骤: 1. **加载**:通过类的全限定名找到该类的二进制字节流。...
- 类加载器实例的线程安全性:如果你的类加载器需要处理多线程环境,需要确保其设计是线程安全的。 - 类的唯一性:类加载器与类的关系是“一对多”,同一类加载器下的类名必须唯一,不同类加载器加载的同名类不...
通过掌握类加载的过程以及类加载器的工作原理,可以帮助开发者更好地处理类加载过程中可能出现的问题,同时也可以为实现某些特殊需求提供支持。希望本文能够帮助读者更加深入地理解和应用Java类加载机制。
了解这一机制对于深入理解Java平台的工作原理至关重要,尤其是在开发自定义类加载器或者处理复杂的依赖管理场景时。 在Java中,类加载主要由三类内置类加载器完成: 1. **引导类加载器(Bootstrap ClassLoader)**...
1. Bootstrap ClassLoader:这是最基础的类加载器,由JVM本身实现,负责加载JRE的`<JAVA_HOME>/lib`目录下的核心类库,或者被`-Xbootclasspath`参数指定的路径中的类。 2. Extension ClassLoader:扩展类加载器,...
WebLogic服务器是一款由甲骨文公司提供的企业级Java应用程序服务器,它使用Java虚拟机(JVM)来运行Java应用程序和Web服务。...此外,掌握类加载过程对于处理热部署、类冲突和资源管理等问题也至关重要。
Java开发中的类加载器是Java运行环境的核心组件之一,它负责查找、加载和初始化类文件。在传统的Java应用中,类通常是从硬盘上的类路径(ClassPath)或模块路径(ModulePath)中加载的。然而,随着开发模式的演变,...
Java 类加载器是Java虚拟机(JVM)的核心组成部分,它负责将编译后的字节码文件(.class文件)加载到JVM中并转换为运行时的数据结构。Tomcat,作为广泛使用...深入研究这些概念,能够让你在处理类加载问题时游刃有余。
展类加载器的加载顺序来理解。系统类加载器在加载类时,会先尝试让扩展类加载器加载,如果...理解类加载器的工作原理有助于我们更好地进行程序设计和优化,特别是在开发插件系统、模块化应用以及处理动态加载需求时。
### RAD 类加载器序列知识点详解 #### 一、概述 在使用WebSphere Application Server (WAS)部署企业级应用时,经常会遇到类加载器(ClassLoader)的...希望本文能帮助开发者更好地理解和处理类加载器相关的配置问题。
例如,`MemoryClassLoader.java`可能就是一个自定义类加载器的实现,它可以在内存中动态加载或更新类。 **JarinJAR**是一种打包技术,它可以将多个JAR文件打包成一个大的JAR文件。在热加载场景下,JarinJAR使得在...
在Java编程语言中,类加载器(ClassLoader)是一个至关重要的组成部分,它负责将类的字节码加载到Java虚拟机(JVM)中,从而使程序能够运行。本篇文章将深入探讨“网络类加载器实现”,这是一个允许从网络上动态加载...
这类工具通常会提供更方便的命令行参数,以便于指定类路径、加载特定的类加载器,或者处理特定的类加载需求。 总结来说,Java应用程序类加载器是Java程序执行的关键部分,它负责在运行时找到并加载类,而它的灵活性...
Java 类加载器是Java运行时环境的一个重要组成部分,它的主要职责是将编译后的字节码(.class文件)加载到JVM中,使得程序能够运行。类加载器的机制保证了类的唯一性,同时也提供了灵活性,允许我们自定义加载逻辑。...
最后,了解类加载器在异常处理中的角色也很重要。例如,当尝试加载不存在的类时,会抛出`ClassNotFoundException`。正确处理这些异常可以帮助我们调试和优化代码。 总之,理解类加载器的工作原理和使用技巧是提升...
Java的类加载器分为Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和App ClassLoader(应用程序类加载器)。自定义类加载器可以继承`java.lang.ClassLoader`,并覆盖`loadClass()`...
本文将深入探讨ClassLoader的工作原理和类加载机制,帮助开发者理解这个至关重要的概念。 1. 类加载机制概述 Java的类加载机制遵循“双亲委派模型”(Delegation Model)。当一个类被加载时,它首先会尝试由当前...
在Java开发过程中,理解类加载和重新加载机制对于优化代码性能、处理复杂系统升级以及提高开发效率至关重要。通过掌握这些知识,开发者能够更好地控制和调试他们的应用程序,尤其是在处理大型分布式系统时。 类加载...
在Java编程中,静态代码块(Static Block)和类加载器(Class Loader)是两个重要的概念,它们在软件开发中有着广泛的应用。本案例聚焦于如何利用静态代码块结合类加载器来高效地获取资源文件,尤其是属性配置文件。...