[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/abcoderX/Note/master/Java_ClassLoader/README.md [Back]  [Original]

### 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)

![](https://github.com/silence940109/Java/blob/master/image/load.gif)

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

![](https://github.com/silence940109/Java/blob/master/image/classLoader.gif)

![](https://github.com/silence940109/Java/blob/master/image/classLoader1.gif)

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

![](https://github.com/silence940109/Java/blob/master/image/loader.gif)

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



![](https://github.com/silence940109/Java/blob/master/image/clasloader.jpg)



	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


Web Proxy Viewer  |  New URL  |  Original Page