public class ClassLoaderUtils extends Object
ClassLoader工具类
| 限定符和类型 | 字段和说明 |
|---|---|
private static String |
ARRAY_SUFFIX
数组类的结尾符: "[]"
|
private static SimpleCache<String,Class<?>> |
CLASS_CACHE |
private static char |
INNER_CLASS_SEPARATOR
内部类分界符: '$'
|
private static String |
INTERNAL_ARRAY_PREFIX
内部数组类名前缀: "["
|
private static String |
NON_PRIMITIVE_ARRAY_PREFIX
内部非原始类型类名前缀: "[L"
|
private static char |
PACKAGE_SEPARATOR
包名分界符: '.'
|
private static Map<String,Class<?>> |
PRIMITIVE_TYPE_NAME_MAP
原始类型名和其class对应表,例如:int =》 int.class
|
| 构造器和说明 |
|---|
ClassLoaderUtils() |
| 限定符和类型 | 方法和说明 |
|---|---|
static ClassLoader |
getClassLoader()
获取
ClassLoader获取顺序如下: 1、获取当前线程的ContextClassLoader 2、获取 ClassLoaderUtils类对应的ClassLoader
3、获取系统ClassLoader(ClassLoader.getSystemClassLoader())
|
static ClassLoader |
getContextClassLoader()
获取当前线程的
ClassLoader |
static JarClassLoader |
getJarClassLoader(File jarOrDir)
创建新的
JarClassLoader,并使用此Classloader加载目录下的class文件和jar文件 |
static boolean |
isPresent(String className)
指定类是否被提供,使用默认ClassLoader
通过调用 loadClass(String, ClassLoader, boolean)方法尝试加载指定类名的类,如果加载失败返回false加载失败的原因可能是此类不存在或其关联引用类不存在 |
static boolean |
isPresent(String className,
ClassLoader classLoader)
指定类是否被提供
通过调用 loadClass(String, ClassLoader, boolean)方法尝试加载指定类名的类,如果加载失败返回false加载失败的原因可能是此类不存在或其关联引用类不存在 |
static Class<?> |
loadClass(File jarOrDir,
String name)
加载外部类
|
static Class<?> |
loadClass(String name)
加载类,通过传入类的字符串,返回其对应的类名,使用默认ClassLoader并初始化类(调用static模块内容和初始化static属性)
扩展 Class.forName(String, boolean, ClassLoader)方法,支持以下几类类名的加载:
1、原始类型,例如:int
2、数组类型,例如:int[]、Long[]、String[]
3、内部类,例如:java.lang.Thread.State会被转为java.lang.Thread$State加载
|
static Class<?> |
loadClass(String name,
boolean isInitialized)
加载类,通过传入类的字符串,返回其对应的类名,使用默认ClassLoader
扩展 Class.forName(String, boolean, ClassLoader)方法,支持以下几类类名的加载:
1、原始类型,例如:int
2、数组类型,例如:int[]、Long[]、String[]
3、内部类,例如:java.lang.Thread.State会被转为java.lang.Thread$State加载
|
static Class<?> |
loadClass(String name,
ClassLoader classLoader,
boolean isInitialized)
加载类,通过传入类的字符串,返回其对应的类名
此方法支持缓存,第一次被加载的类之后会读取缓存中的类 加载失败的原因可能是此类不存在或其关联引用类不存在 扩展 Class.forName(String, boolean, ClassLoader)方法,支持以下几类类名的加载:
1、原始类型,例如:int
2、数组类型,例如:int[]、Long[]、String[]
3、内部类,例如:java.lang.Thread.State会被转为java.lang.Thread$State加载
|
static Class<?> |
loadPrimitiveClass(String name)
加载原始类型的类。
|
private static Class<?> |
tryLoadInnerClass(String name,
ClassLoader classLoader,
boolean isInitialized)
尝试转换并加载内部类,例如java.lang.Thread.State =》java.lang.Thread$State
|
private static final String NON_PRIMITIVE_ARRAY_PREFIX
private static final char PACKAGE_SEPARATOR
private static final char INNER_CLASS_SEPARATOR
private static final Map<String,Class<?>> PRIMITIVE_TYPE_NAME_MAP
private static final SimpleCache<String,Class<?>> CLASS_CACHE
public static ClassLoader getContextClassLoader()
ClassLoaderThread.getContextClassLoader()public static ClassLoader getClassLoader()
ClassLoader1、获取当前线程的ContextClassLoader 2、获取ClassLoaderUtils类对应的ClassLoader 3、获取系统ClassLoader(ClassLoader.getSystemClassLoader())
public static Class<?> loadClass(String name) throws UtilException
Class.forName(String, boolean, ClassLoader)方法,支持以下几类类名的加载:
1、原始类型,例如:int 2、数组类型,例如:int[]、Long[]、String[] 3、内部类,例如:java.lang.Thread.State会被转为java.lang.Thread$State加载
name - 类名UtilException - 包装ClassNotFoundException,没有类名对应的类时抛出此异常public static Class<?> loadClass(String name, boolean isInitialized) throws UtilException
Class.forName(String, boolean, ClassLoader)方法,支持以下几类类名的加载:
1、原始类型,例如:int 2、数组类型,例如:int[]、Long[]、String[] 3、内部类,例如:java.lang.Thread.State会被转为java.lang.Thread$State加载
name - 类名isInitialized - 是否初始化类(调用static模块内容和初始化static属性)UtilException - 包装ClassNotFoundException,没有类名对应的类时抛出此异常public static Class<?> loadClass(String name, ClassLoader classLoader, boolean isInitialized) throws UtilException
Class.forName(String, boolean, ClassLoader)方法,支持以下几类类名的加载:
1、原始类型,例如:int 2、数组类型,例如:int[]、Long[]、String[] 3、内部类,例如:java.lang.Thread.State会被转为java.lang.Thread$State加载
name - 类名classLoader - ClassLoader,null 则使用系统默认ClassLoaderisInitialized - 是否初始化类(调用static模块内容和初始化static属性)UtilException - 包装ClassNotFoundException,没有类名对应的类时抛出此异常public static Class<?> loadPrimitiveClass(String name)
name - 原始类型名,比如 intpublic static JarClassLoader getJarClassLoader(File jarOrDir)
JarClassLoader,并使用此Classloader加载目录下的class文件和jar文件jarOrDir - jar文件或者包含jar和class文件的目录JarClassLoaderpublic static Class<?> loadClass(File jarOrDir, String name)
jarOrDir - jar文件或者包含jar和class文件的目录name - 类名public static boolean isPresent(String className)
loadClass(String, ClassLoader, boolean)方法尝试加载指定类名的类,如果加载失败返回falseclassName - 类名public static boolean isPresent(String className, ClassLoader classLoader)
loadClass(String, ClassLoader, boolean)方法尝试加载指定类名的类,如果加载失败返回falseclassName - 类名classLoader - ClassLoaderprivate static Class<?> tryLoadInnerClass(String name, ClassLoader classLoader, boolean isInitialized)
name - 类名classLoader - ClassLoader,null 则使用系统默认ClassLoaderisInitialized - 是否初始化类(调用static模块内容和初始化static属性)Copyright © 2020. All rights reserved.