自定义类加载器 为什么建议自定义逻辑写在 findClass()而不是重写loadClass()
核心原因就是在jdk1.2之后loadClass()方法已经成为java实现双亲委派机制的核心代码。而我们一般是推荐使用双亲委派模型的,所以不建议直接重写loadClass()方法,若是重写loadClass的过程中不实现双亲委派流程那么就是另一个问题了“破坏双亲委派机制”
java ClassLoader 类 下的loadClass方法
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// First, check if the class has already been loaded
Class<?> c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
long t1 = System.nanoTime();
// 核心点
c = findClass(name);
// this is the defining class loader; record the stats
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
这个时候有的小朋友就说了:我就是要重写loadClass()方法,我不嫌麻烦我把所有loadClass()中关于双亲委派机制的代码全都重新写一遍不就行了吗
我想说的是:可以 但是麻烦啊 而且不光是麻烦还回导致代码的冗余,所以即想使用双亲委派又想省事还想重写类的加载过程的小朋友们,还是老实实的重写findClass()吧