package com.lizard.fastdb.util;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
/**
* ClassLoader工具类
*
* @author SHEN.GANG
*/
@SuppressWarnings("rawtypes")
public final class ClassLoaderUtils
{
/**
* 加载一个给定的资源. 加载时将尝试通过下面的方法步骤获取:
* <ul>
* <li>From Thread.currentThread().getContextClassLoader()
* <li>From ClassLoaderUtils.class.getClassLoader()
* <li>callingClass.getClassLoader()
* </ul>
*
* @param resourceName
* 资源名称(包含路径)
* @param callingClass
* 调用类class
* @return URL资源
*/
public static URL getResource(String resourceName, Class callingClass)
{
URL url = Thread.currentThread().getContextClassLoader().getResource(resourceName);
if ( url == null )
{
url = ClassLoaderUtils.class.getClassLoader().getResource(resourceName);
}
if ( url == null )
{
ClassLoader cl = callingClass.getClassLoader();
if ( cl != null )
{
url = cl.getResource(resourceName);
}
}
if ( (url == null) && (resourceName != null)
&& ((resourceName.length() == 0) || (resourceName.charAt(0) != '/')) )
{
return getResource('/' + resourceName, callingClass);
}
return url;
}
/**
* 加载给定的资源并通过流方式打开<br/> 注意:需要调用者手工关闭流,避免文件流泄露。
*
* @param resourceName
* 资源名称(包含路径)
* @param callingClass
* 调用类class
* @return InputStream
*/
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;
}
}
/**
* 通过给定的class类名称创建其Class对象. 创建Class过程将按照下面的步骤尝试:
* <ul>
* <li>From Thread.currentThread().getContextClassLoader()
* <li>Using the basic Class.forName()
* <li>From ClassLoaderUtils.class.getClassLoader()
* <li>From the callingClass.getClassLoader()
* </ul>
*
* @param className
* 完整类名称
* @param callingClass
* 调用类class
* @throws ClassNotFoundException
* 如果给定的类找不到,则抛出该异常
*/
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);
}
}
}
}
/**
* 获取ClassLoader
*
* @param callingClass
* @return
*/
public static ClassLoader getClassLoader( Class callingClass )
{
ClassLoader cl;
cl = Thread.currentThread().getContextClassLoader();
if( null == cl )
{
cl = ClassLoaderUtils.class.getClassLoader();
}
if( null == cl )
{
cl = callingClass.getClassLoader();
}
return cl;
}
/**
* 获取默认ClassLoader
*
* @return
*/
public static ClassLoader getDefaultClassLoader()
{
return getClassLoader( ClassLoaderUtils.class );
}
}