ClassLoader

来源:互联网 发布:日文同声翻译软件 编辑:程序博客网 时间:2024/06/05 15:31

1、对于xxx.class文件,ClassLoader将其Load到内存中CodeSegment中;

2、运行环境找到main方法开始执行

3、运行过程中会有更多的class被load到内存。


ClassLoader的类加载机制

并非一次性加载

需要的时候加载(运行期间动态加载)

static语句块在加载后执行一次

dynamic语句块每次new新的对象都会执行

TestDynamicLoading.java


package reflection;/** * @author fang * 运行时设置jvm参数                      -verbose:class * */public class TestDynamicLoading {public static void main(String[] args) {new A();System.out.println("**--------------------------------**");new B();new C();new C();new D();new D();}}class A{}class B{}class C{//只会被执行一次!static{System.out.println("CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC");}}class D{//动态语句块,每次new对象时候都会执行!无条件执行!{System.out.println("DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD");}}

JDK内置ClassLoader

bootstrap class loader(其他的classLoader都是首先被这个bootstrap加载进内存,然后其他的ClassLoderload其他的Class。这个bootstrap没有名字,拿出来的引用为null)

* implemented by native language
* load the core classes of jdk


extesion class loader
* loader the class from jre/lib/ext


application class loader
* load user-define classes
* ClassLoader.getSystemClassLoader()


other class loaders
* SecureClassLoader
* URLClassLoader
* ...

package reflection;public class TestJDKClassLoader1 {public static void main(String[] args) {System.out.println(String.class.getClassLoader());System.out.println(com.sun.crypto.provider.DESKeyFactory.class.getClassLoader().getClass().getName());System.out.println(TestJDKClassLoader1.class.getClassLoader().getClass().getName());System.out.println(ClassLoader.getSystemClassLoader().getClass().getName());}}


在appClasLoader里面有个引用指向extClassLoader,在extClassLoader里面有个引用指向bootstrapClassLoader,其他的classLoader里面有个引用指向appClasLoader,找出这种指向关系用ClassLoader.getParent()方法
当appClassLoader加载TestJDKClassLoader时,先去它parent 的ClassLoader,即extClassLoader查看这个类是否被加载了,如果没有被加载,则extClassLoader去查看它自己的parent classLoader是否加载了TestJDKClassLoader,如果都没有加载,则appClassLoader加载TestJDKClassLoader!这样,自己写的String类肯定不会被加载,因为appClassLoader在询问过程中发现bootstrap class loader加载了系统自带的 String。


package reflection;public class TestJDKClassLoader2 {public static void main(String[] args) {ClassLoader c=TestJDKClassLoader2.class.getClassLoader();while(c!=null){System.out.println(c.getClass().getName());c=c.getParent();}}}


站在ClassLoader的角度看codeSegment,xxx.class是一个个的Class对象。


package reflection;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class TestReflection {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {//注意写全包名String str="reflection.T";Class c=Class.forName(str);Object o=c.newInstance();Method[] methods=c.getMethods();for(Method m: methods){System.out.println(m.getName());if(m.getName().equals("mm")){m.invoke(o);}if(m.getName().equals("m1")){m.invoke(o, 4);//拿到某个方法的参数类型for(Class paramType : m.getParameterTypes()){System.out.print(paramType.getName()+" ");}System.out.println();Class returnType=m.getReturnType();System.out.println(returnType.getName());}}}}class T{static{System.out.println("T loaded!");}public T(){System.out.println("T constructed!");}int i;String s;public void m1(int i){this.i=i;System.out.println(i);}public void mm(){System.out.println("mm invoked");}public String getS(){return s;}}





0 0
原创粉丝点击