欢迎来到天天文库
浏览记录
ID:8809666
大小:57.50 KB
页数:6页
时间:2018-04-08
《jvm反射和动态代理》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、(从csdn的blog转来) Java程序的工作机制:Java对象都以单独的class文件存在,java虚拟机将其载入并执行其虚拟机指令。Java虚拟机查找这些java对象:java虚拟机根据classpath来查找java对象,而虚拟机的classpath又分为三层:bootstrap:sun.boot.class.pathextension:java.ext.dirsapplication:java.class.path三个classpath各有对应的classloader。由上而下形成父子关系当程序中调
2、用new指令,或者ClassLoader.load方法时。其顺序如下:1. 首先查看application的classloader中是否已有对应的class缓存,如果有则返回,并根据class分配内存。如果没有,接下一步。2. 首先查看extension的classloader中是否已有对应的class缓存,如果有则返回,并根据class分配内存。如果没有,接下一步。3. 首先查看bootstrap的classloader中是否已有对应的class缓存,如果有则返回,并根据cla
3、ss分配内存。如果没有,接下一步。4. 由bootstrap的classloader在其classpath中试图加载该class,如果有,则将该class放入cache中,并返回。如果没有,接下一步。5. 由extension的classloader在其classpath中试图加载该class,如果有,则将该class放入cache中,并返回。如果没有,接下一步。6. 由application的classloader在其classpath中试图加载该class,如果有,则将该cl
4、ass放入cache中,并返回。如果没有,则抛出ClassNotFound的exception。Java虚拟机加载这些java对象:每个java虚拟机都在其启动时产生一个唯一的classheap,并把所有的classinstance都分配在其中。其中每个类实例的信息又分两部分,fields域和methods域。每个类实例各自拥有fields,但同一个类的不同实例共享methods反射JVM对反射的处理简单例子代码:importjava.lang.reflect.InvocationHandler;import
5、java.lang.reflect.Method;importjava.lang.reflect.InvocationTargetException;importjava.io.IOException;publicclassMain{publicstaticvoidmain(String[]args){TempImplt1=newTempImpl("temp1");try{Methodt1Talk=t1.getClass().getMethod("Talk",newClass[0]);t1Talk.invok
6、e(t1,null);}catch(NoSuchMethodExceptione){e.printStackTrace();//TochangebodyofcatchstatementuseFile
7、Settings
8、FileTemplates.}catch(IllegalAccessExceptione){e.printStackTrace();//TochangebodyofcatchstatementuseFile
9、Settings
10、FileTemplates.}catch(InvocationTarg
11、etExceptione){e.printStackTrace();//TochangebodyofcatchstatementuseFile
12、Settings
13、FileTemplates.}try{System.in.read();}catch(IOExceptione){e.printStackTrace();//TochangebodyofcatchstatementuseFile
14、Settings
15、FileTemplates.}}}复杂例子代码:importjava.lang.reflect.Invo
16、cationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.InvocationTargetException;importjava.io.IOException;publicclassMain{publicstaticvoidmain(String[]args){TempImplt1=newTempImpl("temp1
此文档下载收益归作者所有