java Class类的理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wx19950101/article/details/79882406

参考文章:https://blog.csdn.net/javazejian/article/details/70768369

一 Class类是什么:java.lang包里的一个类,只是名字和class很像,java区分大小写

二 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容器)

猜你喜欢

转载自blog.csdn.net/wx19950101/article/details/79882406