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());}}
当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
- classLoader
- classloader
- ClassLoader
- ClassLoader
- ClassLoader
- classloader
- ClassLoader
- ClassLoader
- classloader
- ClassLoader
- classloader
- classloader
- classloader
- ClassLoader
- ClassLoader
- classloader
- ClassLoader
- ClassLoader
- 使用SSH协议连接GitHub(对于一个版本库从https迁移到SSH)
- php的curl获取https加密协议请求返回json数据进行信息获取
- scanf()、getch()、getchar()、getc()、gets()、cin、cin.get()、cin.getline()、getline()
- Struts2应用的开发步骤
- Asp.net常用技巧
- ClassLoader
- php无法操作session
- GDI基础介绍之几何绘图
- 发布应用到AppStore
- 一张图让你了解云计算
- 面试题(Part One——SQL SERVER)
- 初学Java,闭包和回调(二十一)
- hql使用not exists
- 嵌入式 tcp或者udp发包协议使用结构体注意事项