JavaVM,反射与动态代理

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

JavaVM,反射与动态代理

Java程序的工作机制:Java对象都以单独的class文件存在,java虚拟机将其载入并执行其虚拟机指令。

Java虚拟机查找这些java对象:

java虚拟机根据class path来查找java对象,而虚拟机的class path又分为三层:

bootstrap:sun.boot.class.path

extension: java.ext.dirs

application: java.class.path

三个class path各有对应的classloader。由上而下形成父子关系

当程序中调用new指令,或者ClassLoader.load方法时。其顺序如下:

1. 首先查看application的classloader中是否已有对应的class缓存,假如有则返回,并根据class分配内存。假如没有,接下一步。

2. 首先查看extension的classloader中是否已有对应的class缓存,假如有则返回,并根据class分配内存。假如没有,接下一步。

3. 首先查看bootstrap的classloader中是否已有对应的class缓存,假如有则返回,并根据class分配内存。假如没有,接下一步。

4. 由bootstrap的classloader在其class path中试图加载该class,假如有,则将该class放入cache中,并返回。假如没有,接下一步。

5. 由extension的classloader在其class path中试图加载该class,假如有,则将该class放入cache中,并返回。假如没有,接下一步。

6. 由application的classloader在其class path中试图加载该class,假如有,则将该class放入cache中,并返回。假如没有,则抛出ClassNotFound的exception。

Java虚拟机加载这些java对象:

每个java虚拟机都在其启动时产生一个唯一的class heap,并把所有的class instance都分配在其中。其中每个类实例的信息又分两部分,fields域和methods域。每个类实例各自拥有fields,但同一个类的不同实例共享methods

反射

JVM对反射的处理

简单例子代码:

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.InvocationTargetException;

import java.io.IOException;

public class Main {

public static void main(String[] args){

TempImpl t1 = new TempImpl("temp1");

try {

Method t1Talk = t1.getClass().getMethod("Talk", new Class[0]) ;

t1Talk.invoke(t1, null);

} catch (NoSUChMethodException e) {

e.printStackTrace(); //To change body of catch statement use File Settings File Templates.

} catch (IllegalAccessException e) {

e.printStackTrace(); //To change body of catch statement use File Settings File Templates.

} catch (InvocationTargetException e) {

e.printStackTrace(); //To change body of catch statement use File Settings File Templates.

}

try {

System.in.read();

} catch (IOException e) {

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航