### Java CLassLoader
class loader Java Java Java Java Web OSGi
Java Java Java Java JDK 1.0 Java Applet Java Applet Java Web OSGi Java Java ClassNotFoundExceptionNoClassDefFoundError Java Java
****
JVMLoadLink(Initialize)

1)
2)
3)
classJVMclassJVMclass
private static int a = 10aastaticaint0a=0,a10a,a=10
****
* 1new
* 2
* 3
* 4Class.forName("com.lyj.load")
* 5
* 6JVM
6
1
2
3)staticstatic
****
.classjava.lang.Class


Class
ClassJava
1
2.class
3zipjar.class
4.class
5Java.class
****
class loader Java Java Java Java Java .java Java Java .class Java java.lang.Class Java newInstance() Java
****
[http://blog.csdn.net/cutesource/article/details/5904501](http://blog.csdn.net/cutesource/article/details/5904501)
JVMClassLoader

1Bootstrap ClassLoader
$JAVA_HOMEjre/lib/rt.jarclassC++ClassLoader
2Extension ClassLoader
javajar$JAVA_HOMEjre/lib/*.jar-Djava.ext.dirsjar
3App ClassLoader
classpathjarclass
4Custom ClassLoader
ClassLoadertomcatjbossj2eeClassLoader
Custom ClassLoaderBootStrap
ClassLoaderclassloader
ClassLoader
java.lang.ClassLoader Java
**java.lang.ClassLoader**
java.lang.ClassLoader Java java.lang.ClassClassLoader Java ClassLoader 1
* getParent()
* loadClass(String name) name java.lang.Class
* findClass(String name) name java.lang.Class
* findLoadedClass(String name) name java.lang.Class
* defineClass(String name, byte[] b, int off, int len) b Java java.lang.Class final
* resolveClass(Class c) Java
1 name com.example.Sample$1com.example.Sample$Inner
****
Java Java
* bootstrap class loader Java java.lang.ClassLoader
* extensions class loader Java Java Java
* system class loader Java CLASSPATH Java Java ClassLoader.getSystemClassLoader()
java.lang.ClassLoader
1 getParent() Java Java Java 1

public class ClassLoaderTree {
public static void main(String[] args) {
ClassLoader loader = ClassLoaderTree.class.getClassLoader();
while (loader != null) {
System.out.println(loader.toString());
loader = loader.getParent();
}
}
}
Java getClassLoader() 1getParent() 1 2
sun.misc.Launcher$AppClassLoader@9304b1
sun.misc.Launcher$ExtClassLoader@190d11
ClassLoaderTree sun.misc.Launcher$AppClassLoader sun.misc.Launcher$ExtClassLoader JDK getParent() null
****
Java Java Java Java com.example.Sample Sample.classClassLoaderA ClassLoaderB Sample.class java.lang.Class Java ClassCastException 3 Java com.example.Sample
Sample
public class Sample {
private Sample instance;
public void setSample(Object instance) {
this.instance = (Sample) instance;
}
}
Sample setSample java.lang.ObjectSample Java
Java
public void testClassIdentity() {
String classDataRootPath = "C:\\workspace\\Classloader\\classData";
FileSystemClassLoader fscl1 = new FileSystemClassLoader(classDataRootPath);
FileSystemClassLoader fscl2 = new FileSystemClassLoader(classDataRootPath);
String className = "com.example.Sample";
try {
Class class1 = fscl1.loadClass(className);
Object obj1 = class1.newInstance();
Class class2 = fscl2.loadClass(className);
Object obj2 = class2.newInstance();
Method setSampleMethod = class1.getMethod("setSample", java.lang.Object.class);
setSampleMethod.invoke(obj1, obj2);
} catch (Exception e) {
e.printStackTrace();
}
}
4 FileSystemClassLoader Samplejava.lang.Class newInstance() obj1 obj2 Java API obj1 setSample obj2 obj1 instance 4 5
Java
package com.example;
public class Sample {
private Sample instance;
public void setSample(Object instance) {
this.instance = (Sample) instance;
}
}
3com.example.Sample setSample java.lang.Objectcom.example.Sample Java 4
Java
public void testClassIdentity() {
String classDataRootPath = "C:\\workspace\\Classloader\\classData";
FileSystemClassLoader fscl1 = new FileSystemClassLoader(classDataRootPath);
FileSystemClassLoader fscl2 = new FileSystemClassLoader(classDataRootPath);
String className = "com.example.Sample";
try {
Class class1 = fscl1.loadClass(className);
Object obj1 = class1.newInstance();
Class class2 = fscl2.loadClass(className);
Object obj2 = class2.newInstance();
Method setSampleMethod = class1.getMethod("setSample", java.lang.Object.class);
setSampleMethod.invoke(obj1, obj2);
} catch (Exception e) {
e.printStackTrace();
}
}
4 FileSystemClassLoadercom.example.Samplejava.lang.Class newInstance() obj1 obj2 Java API obj1 setSample obj2 obj1 instance 4 5
Java
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at classloader.ClassIdentity.testClassIdentity(ClassIdentity.java:26)
at classloader.ClassIdentity.main(ClassIdentity.java:9)
Caused by: java.lang.ClassCastException: com.example.Sample
cannot be cast to com.example.Sample
at com.example.Sample.setSample(Sample.java:7)
... 6 more
5 java.lang.ClassCastException obj1 obj2 Java
Java Java java.lang.Objectjava.lang.Object Java Java java.lang.Object Java Java Java
Java Java Java
****
Java 6
public class FileSystemClassLoader extends ClassLoader {
private String rootDir;
public FileSystemClassLoader(String rootDir) {
this.rootDir = rootDir;
}
protected Class findClass(String name) throws ClassNotFoundException {
byte[] classData = getClassData(name);
if (classData == null) {
throw new ClassNotFoundException();
}
else {
return defineClass(name, classData, 0, classData.length);
}
}
private byte[] getClassData(String className) {
String path = classNameToPath(className);
try {
InputStream ins = new FileInputStream(path);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int bufferSize = 4096;
byte[] buffer = new byte[bufferSize];
int bytesNumRead = 0;
while ((bytesNumRead = ins.read(buffer)) != -1) {
baos.write(buffer, 0, bytesNumRead);
}
return baos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private String classNameToPath(String className) {
return rootDir + File.separatorChar
+ className.replace('.', File.separatorChar) + ".class";
}
}
6 FileSystemClassLoader java.lang.ClassLoader 1 java.lang.ClassLoader findClass(String name)java.lang.ClassLoaderloadClass() findLoadedClass() loadClass() findClass() loadClass() findClass()
FileSystemClassLoader findClass().class defineClass() java.lang.Class