类型类 && .class 与 .getClass() 的区别
一、 什么是类型类
Java 中的每一个类(.java 文件)被编译成 .class 文件的时候,Java虚拟机(JVM)会为这个类生成一个类对象(我们姑且认为就是 .class 文件),这个对象包含了这个类全部的信息,包括成员属性、方法、构造器等。往后,如果你要实例化或创建一个对象的时候,都是以这个对象(.class)文件为蓝图进行创建。这个类对象就是我们指的类型类。
二、 创建一个对象
例如下方创建一个Test类的对象
1. Class<?> testTemplet = Class.forName(“Keywords (包名)+Test”);
testTemplet 就是Java在编译 Test.java 文件时生成的类的类对象
2. 我们平时会用下面这个方法来实例化或创建一个类的对象
Test t = new Test();
其实在这其中,实例化对象 t 就是以testTemplet为模板创建的
3. 上面创建一个实例的方法实际上就相当于
t = testTemplet.newInstance()
t 是 testTemplet 的一个实例。
三、 得到一个类型类
一个类可以有两种身份,相对于类中的属性、方法,那么这个类就是我们平时认为的具有抽象意义的一个概念。而如果相对于我们上方对于对象创建中的说法的话,那么类又非常像一个对象,无论是这个类的对象还是这个类本身都可以看作是他的类对象的对象。
对于一个类,得到类型类就相当于得到他的本身,对于一个对象,就相当于得到他的蓝图。
有两个方法可以得到类型类:
类名 .class Bank.class
对象 . getClass() Bank b = new Bank(); b.getClass();
两个方法有什么不同呢?
.class 获得一个类的类型类, .getClass() 获得一个对象的类型类
而且 getClass() 得到的是将他实力的类的类型类
例如: Father father = new Child();
Father.class 指的是Father
father.getClass() 指的是Child
下面我们来看一个例子:
1. 输出类型类的名字(其中b 是Bank.java 的对象,此方法在Test中定义)
输出结果为
可以看见,输出的名字都是包名+类名,与他们是对象还是一个类没有任何关系。这说明,无论你是通过一个对象还是通过一个类获得的类型类都是一样的。
2. 下面我们看一下他们的地址。我在这里先获取一份Bank.class文件,再输出他的绝对地址。
file1是通过Test的类型类获得的,file2是通过eywords 的类型类获得的。
输出结果为
可以看到他们的地址输出时一样的,当然,这肯定应该是一样。
我想说明的是,根据相对路径的知识,我们可以知道,你的Test 和Keywords 的类型类的储存地址是在 D:\Eclipse_Worlplace\Try\bin\Bag 下,有没有一点感觉?没错,他就是我们编译后class文件储存的地址,所以我在开始的时候喜欢把他们两混合记忆,但是至于是不是,我还没有查到相关资料,你姑且可以这么认为。