日历

2008 10.12 Sun
   1234
567891011
12131415161718
19202122232425
262728293031 
«» 2008 - 10 «»

文章搜索

日志文章

2007年10月20日 22:48:25

反射机制

反射的初步概念:
    对于classloader,每一个.class实际就是一个Class对象
    Class是对类信息的表述,是类的metainfo/metadata(元信息/元数据)


ClassLoader类中的 [url=file:///D:/jdk-6-doc/docs/api/java/net/URL.html]URL [url=file:///D:/jdk-6-doc/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String)]getResource([url=file:///D:/jdk-6-doc/docs/api/java/lang/String.html]String name)在查找[url=file:///D:/jdk-6-doc/docs/api/java/lang/String.html]String name时,会找遍当前设定的classpath目录,这就是为何把images包放在src下,因为src目录在编译后会被默认的放在bin目录下,而classpath路径中的 .(当前路径代表项目的bin目录),所以说要查找的images目录相当于在classpath下(相关实例在坦克大战图片版/加入爆炸图片_1中)。


类的初步动态加载机制:类在被classloader第一次加载进入内存中后,并不是一次性的把类中的用到的其他类一次性的全部加载,而是执行到哪个类,才加载哪个类,
    当类被loader到内存中,其静态语句块static{}只被执行了一次,在创建对象时不会被重复loader进入内存中。而动态语句块{}会被多次loader进入内存。
   
    JDK内置的ClassLoader有:bootstrap classloader(1. implemented by native language 2.load the core class of jdk)         extesion classloader(loader the class from jre/lib/ext)
                                    Application classloader(1.loader user-define classes 2.ClassLoader.getSystemClassLoader()) SecureClassLoaderURLClassLoader
   
    ClassLoader之间的分层关系是:appliacation ClassLoader 对象之中有一个parent引用指向了extesion ClassLoader,因此appliacation ClassLoader对象可以通过getParent()得到parent引用指向的extesion ClassLoader对象了。
    ClassLoaderload class的时候首先找上层loader是不是load过了,如果已经load过了,就不会再次load 优点是:安全性好!
                                自己写的String.class永远没有机会执行(破坏性的代码)


    Class类中有一个forName(String name)可以把名字name 的类load到内存中去,而返回name.classclass类的对象,当调用newInstance()来创建一个类对象!调用getMethods方法返回的是该类中方法类型的数组引用(Methods[]),而每个方法对象可以使用过 getReturnType()的到方法的返回类型,同样可以使用getParameterType()来得到参数类型。

Tags: 反射  

类别: 技术专栏 |  评论(0) |  浏览(626) |  收藏
发表评论
看不清楚,换一张