反射概述

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。

获取字节码文件的三种方式

  • Object类的getClass()方法(例:判断两个对象是否是同一个字节码文件)
  • 静态属性class,(例:锁对象)
  • Class类中静态方法forName()(例:读取配置文件)

    反射的三个阶段

    3.反射 - 图1

    演示

    1. public static void main(String[] args) throws ClassNotFoundException {
    2. //方式一
    3. Class clazz1 = Class.forName("cn.giteasy.common.Person");
    4. //方式二
    5. Class clazz2 = Person.class;
    6. //方式三
    7. Person p = new Person();
    8. Class clazz3 = p.getClass();
    9. System.out.println(clazz1 == clazz2);//true
    10. System.out.println(clazz2 == clazz3);//true
    11. }

    equals方法用例

    1. @Override
    2. public boolean equals(Object obj) {
    3. if (this == obj) {
    4. return true;
    5. }
    6. if (obj == null) {
    7. return false;
    8. }
    9. //判断调用对象和传入对象的字节码文件是否是同一个字节码文件
    10. if (this.getClass() != obj.getClass())
    11. {
    12. return false;
    13. }
    14. Person other = (Person) obj;
    15. if (age != other.age) {
    16. return false;
    17. }
    18. if (name == null) {
    19. if (other.name != null){
    20. return false;
    21. }
    22. } else if (!name.equals(other.name)){
    23. return false;
    24. }
    25. return true;
    26. }