Class类简介
在Object类中定义了public final Class getClass()方法,此方法将被所有子类继承。该方法返回的类型是一个Class类,Class类是java反射的源头,实际上所谓反射从程序的运行结果来看也很好理解,即:可以通过对象反射求出类的名称。对象对照镜子后可以得到很多信息:某个类的属性、方法和构造器、某个类实现了那些接口、对于每个类而言,JRE都为其保留一个不变的Class类型的对象,一个Class对象包含了特定的某个结果结构的有关信息。
- Class本身也是一个类,Class对象只能由系统创建
- 一个加载的类在JVM中只会有一个Class实例,即在内存中存在唯一的哈希值
- 一个Class对象对用的是一个加载到JVM的一个.class文件
- 通过Class可以完整的获取一个类中的所有被加载的结构
- Class类是Java反射的根源,针对任何想要动态加载、运行的类,唯有先获得相应的Class对象
几乎所有的类(包括Class类自己)都存在一个Class类,如图:
获取Class类
Java提供了多种获取Class类的方法:
(1)如已经知道具体的类,通过类的class属性可获取,该方法最安全可靠,程序性能更高。
语法:Class c=类名.class;
(2)如已经知道某个类的实例对象,调用该实例对象的getClass方法获取Class对象。
语法:Class c=实例对象.getClass();
(3)如已经知道一个类的全类名,且该类在类路径下,可以通过Class类的静态方法forName()获取,该方法可能会抛出ClassNotFoundException异常,需要处理异常。
语法:Class c=Class.forName(“全类名”);
package MyPackage_2;public class Test02 {public static void main(String[] args) throws ClassNotFoundException {//方式一:通过类名.class获取Class c1=Person.class;//方式三:通过forName获取,需要抛出异常或try-catchClass c2=Class.forName("MyPackage_2.Person");//方式二:通过对象的getClass方法获取Person person=new Person();Class c3=person.getClass();System.out.print(c1+"的哈希值:");System.out.println(c1.hashCode());System.out.print(c2+"的哈希值:");System.out.println(c2.hashCode());System.out.print(c3+"的哈希值:");System.out.println(c3.hashCode());}}class Person{String name;int age;int id;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}}
运行结果:
此外还可以获取父类的Class:
//还可以获取父类的Class类Student student=new Student();Class c5=student.getClass();Class c6=c5.getSuperclass();System.out.println("c5:"+c5);System.out.println("c6:"+c6);
Student是Person类的子类,获取student对象的Class类c5之后,还可以使用c5的getSuperclass方法
运行结果:
