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类,如图:
image.png

获取Class类

Java提供了多种获取Class类的方法:
(1)如已经知道具体的类,通过类的class属性可获取,该方法最安全可靠,程序性能更高。
语法:Class c=类名.class;
(2)如已经知道某个类的实例对象,调用该实例对象的getClass方法获取Class对象。
语法:Class c=实例对象.getClass();
(3)如已经知道一个类的全类名,且该类在类路径下,可以通过Class类的静态方法forName()获取,该方法可能会抛出ClassNotFoundException异常,需要处理异常。
语法:Class c=Class.forName(“全类名”);

  1. package MyPackage_2;
  2. public class Test02 {
  3. public static void main(String[] args) throws ClassNotFoundException {
  4. //方式一:通过类名.class获取
  5. Class c1=Person.class;
  6. //方式三:通过forName获取,需要抛出异常或try-catch
  7. Class c2=Class.forName("MyPackage_2.Person");
  8. //方式二:通过对象的getClass方法获取
  9. Person person=new Person();
  10. Class c3=person.getClass();
  11. System.out.print(c1+"的哈希值:");
  12. System.out.println(c1.hashCode());
  13. System.out.print(c2+"的哈希值:");
  14. System.out.println(c2.hashCode());
  15. System.out.print(c3+"的哈希值:");
  16. System.out.println(c3.hashCode());
  17. }
  18. }
  19. class Person{
  20. String name;
  21. int age;
  22. int id;
  23. public String getName() {
  24. return name;
  25. }
  26. public void setName(String name) {
  27. this.name = name;
  28. }
  29. public int getAge() {
  30. return age;
  31. }
  32. public void setAge(int age) {
  33. this.age = age;
  34. }
  35. public int getId() {
  36. return id;
  37. }
  38. public void setId(int id) {
  39. this.id = id;
  40. }
  41. }

运行结果:
image.png
此外还可以获取父类的Class:

  1. //还可以获取父类的Class类
  2. Student student=new Student();
  3. Class c5=student.getClass();
  4. Class c6=c5.getSuperclass();
  5. System.out.println("c5:"+c5);
  6. System.out.println("c6:"+c6);

Student是Person类的子类,获取student对象的Class类c5之后,还可以使用c5的getSuperclass方法
运行结果:
image.png