/*
* Copyright (C) 2010---2014 星星(wuweixing)<349446658@qq.com>
*
* This file is part of Wabacus
*
* Wabacus is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.wabacus.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.wabacus.exception.WabacusConfigLoadingException;
public class WabacusClassLoader extends ClassLoader
{
private static Log log=LogFactory.getLog(WabacusClassLoader.class);
private ClassLoader parentLoader;
private List<String> classRepository=new ArrayList<String>();
public WabacusClassLoader(ClassLoader parent)
{
super(parent);
parentLoader=parent;
if(parent==null) throw new IllegalArgumentException("必须提供父装载器!");
}
public synchronized Class loadClass(String name) throws ClassNotFoundException
{
return loadClass(name,false);
}
protected synchronized Class loadClass(String name,boolean resolve)
throws ClassNotFoundException
{
Class c=findLoadedClass(name);
ClassNotFoundException ex=null;
if(c==null&&parentLoader!=null)
{
try
{
c=parentLoader.loadClass(name);
}catch(ClassNotFoundException e)
{
ex=e;
}
}
if(c==null)
{
try
{
c=this.findSystemClass(name);
}catch(ClassNotFoundException e)
{
ex=e;
}
}
if(c==null)
{
throw ex;
}
if(resolve)
{
resolveClass(c);
}
return c;
}
public synchronized Class loadClass(String className,byte[] classBytes)
{
if(classBytes==null||className==null||className.trim().equals(""))
{
return null;
}
return this.defineClass(className,classBytes,0,classBytes.length);
}
public void addClassPath(String strClassPath)
{
if(classRepository==null) classRepository=new ArrayList<String>();
if((strClassPath!=null)&&!(strClassPath.equals("")))
{
StringTokenizer tokenizer=new StringTokenizer(strClassPath,File.pathSeparator);
while(tokenizer.hasMoreTokens())
{
classRepository.add(tokenizer.nextToken());
}
}
}
public synchronized Class loadClassFromClassPath(String className)
{
Iterator<String> dirs=classRepository.iterator();
byte[] classBytes=null;
while(dirs.hasNext())
{
String dir=(String)dirs.next();
String classFileName=className.replace('.',File.separatorChar);
classFileName+=".class";
try
{
File file=new File(dir+File.separatorChar+classFileName);
if(file.exists())
{
InputStream is=new FileInputStream(file);
classBytes=new byte[is.available()];
is.read(classBytes);
break;
}
}catch(IOException ex)
{
ex.printStackTrace();
return null;
}
}
return this.defineClass(className,classBytes,0,classBytes.length);
}
public Class loadClassByCurrentLoader(String classname)
{
if(classname==null||classname.trim().equals("")) return null;
/* ClassLoader contextClassLoader=Thread.currentThread().getContextClassLoader();
if(contextClassLoader==null) contextClassLoader=WabacusClassLoader.class.getClassLoader();
try
{
return contextClassLoader.loadClass(classname);
}catch(ClassNotFoundException e)
{
throw new WabacusConfigLoadingException("装载类"+classname+"失败,没有找到此类!",e);
}*/
try
{
return this.loadClass(classname);
}catch(ClassNotFoundException e)
{
throw new WabacusConfigLoadingException("装载类"+classname+"失败,没有找到此类!",e);
}
}
}