package org.nutz.aop;
import java.security.AccessController;
import java.security.PrivilegedAction;
import org.nutz.lang.Lang;
/**
* 一个默认的类加载器
*
* @author Wendal(wendal1985@gmail.com)
*/
public class DefaultClassDefiner extends ClassLoader implements ClassDefiner {
protected static ClassDefiner one;
protected static ClassLoader moreClassLoader;
public static void init(ClassLoader cd) {
if (one == null) {
synchronized (DefaultClassDefiner.class) {
if (one == null) {
AccessController.doPrivileged(new PrivilegedAction<DefaultClassDefiner>() {
public DefaultClassDefiner run() {
one = new DefaultClassDefiner(DefaultClassDefiner.class.getClassLoader());
return (DefaultClassDefiner) DefaultClassDefiner.defaultOne();
}
});
}
}
}
if (moreClassLoader == null)
moreClassLoader = cd;
}
public static ClassDefiner defaultOne() {
if (one == null)
init(null);
return one;
}
public static final Class<?> def(String className, byte[] bytes) {
try {
return defaultOne().load(className);
} catch (Throwable e) {
// TODO: handle exception
}
return defaultOne().define(className, bytes);
}
/**
* 虽然是public的,但一般情况下不需要用哦. 用默认的全局ClassDefiner就很好.
*/
public DefaultClassDefiner(ClassLoader parent) {
super(parent);
}
public Class<?> define(String className, byte[] bytes) throws ClassFormatError {
try {
return load(className);
}
catch (ClassNotFoundException e) {}
// If not found ...
return defineClass(className, bytes, 0, bytes.length);
}
public boolean has(String className) {
try {
load(className);
return true;
}
catch (ClassNotFoundException e) {}
return false;
}
public Class<?> load(String className) throws ClassNotFoundException {
try {
return Lang.loadClass(className);
}
catch (ClassNotFoundException e) {
try {
return ClassLoader.getSystemClassLoader().loadClass(className);
}
catch (ClassNotFoundException e2) {
try {
return getParent().loadClass(className);
}
catch (ClassNotFoundException e3) {}
}
catch (SecurityException e2) {// Fix for GAE 1.3.7, Fix issue 296
try {
return getParent().loadClass(className);
}
catch (ClassNotFoundException e3) {}
}
}
if (moreClassLoader != null) {
try {
return moreClassLoader.loadClass(className);
} catch (Throwable e) {
}
}
return super.loadClass(className);
}
public static void reset() {
one = null;
defaultOne();
}
}