一 Class类是什么:java.lang包里的一个类,只是名字和class很像,java区分大小写
//java 类在编译后会产生一个以.class结尾的字节码文件
//该文件内存储了Class对象的相关信息,Class对象表示的是类在运行时的类型信息
//Class与java.lang.reflect构成了java的反射技术
//当我们要使用类时,例如使用new 操作符实例化一个新对象,访问类的静态方法,
//jvm会先检查该类的有无加载,若有加载了就会直接进行相应的操作
//若检查到没有加载,jvm就会先去加载这个类的对应的字节码文件(这里会进行相应的检查)
//当加载成功后,就可以进行相应的操作了
二 Class类的作用
1 Class类的实例什么时候创建,如何创建,这里有两种说法,不过不影响我们的理解(我认为是jvm加载类的时候加上的)
(1)java源文件被编译成java字节码(class文件)时,会在这个字节码文件中加上一个Class对象
(2)jvm在加载类的时候会加上一个Class对象
2 所有的java对象共用这一个Class对象,Class对象是和类定义放在一起的。

3 作用:但我们新建一个类的实例(对象)或者引用类的静态变量的时候,JVM是根据这个类的属性class对象创建实例对象或者提供静态变量的引用值。比如:Person person = new Person(); 首先去加载Person.class,然后找Person.class中的Person.class对象,没有找到就加载Person.class对象,然后根据Person.class对象去创建Person的实例对象p。
4 这里有个地方比较拗口:类的class属性是Class类的实例,这个class对象的内容是类的信息。
例如:Person.class的内容是Person类的信息(成员变量、方法等等)
三 获取Class实例对象的三种方法
1 类名.class(jvm加载类的时候添加的class属性)
2 Class.forName("类的全名")(Class的方法,最后是调用的Class的native方法forName0(),这个用得比较多,Class.forName("com.mysql.jdbc.Driver").newInstance()
说明:再调用Class.forName("xxx")的时候,JVM会加载这个类,如果你的这个类中有static代码块,这个时候,static代码块会执行。为什么要用Class.forName("com.mysql.jdbc.Driver")?只是为了在编译器确定有没有驱动,其实import com.mysql.jbdc.Driver是一样的。
3 实例对象.getClass()(用的是Object的native方法getClass)
三 Class类和java反射机制
1 Class类是java反射机制的源头
2 spring IOC中java反射的运用,伪代码举例:
一般的bean的配置:<bean id="test" class="com.indi.wangx.Test">
在spring中:
Class<T> class = Class.forName("com.indi.wangx.Test");
T t = class.newInstance();
contanier.put(t)(contanier是IOC容器)
*********************************************************************************************************************
*********************************************************************************************************************
3.Field Method
网友评论