zoukankan      html  css  js  c++  java
  • Android(java)学习笔记46:反射机制

    1. 反射机制:

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

    获取任何相应.class文件对应的Class类型的对象,然后利用这个对象去调用该.class文件中任意成员变量和方法。

    但是获得.class文件的Class类对象是重点,怎么获取呢?

    (1)Class类:

    成员变量:   类Field,通过这个表示成员变量的类的对象,去调成员变量

    构造方法:   类Constructor,通过这个表示构造方法的类的对象,去调构造方法

    成员方法:   类Method,通过这个表示成员方法的类的对象,去调成员方法

    Class类的成员变量、构造方法和成员方法都是类。

    (2)获取.class文件的Class类对象的三种方式:

    方式1:Object类的getClass()方法

              Person p = new  Person();

              Class c = p.getClass();

    注意:倘若:

              Person p = new  Person();

              Class c = p.getClass();

              Person p2 = new  Person();

              Class c2 = p.getClass();

              System.out.println(c == c2);// true  Class类是抽象总结,自然也表示一个类

    Class类是其他类的抽象总结,它里面的成员变量,构造方法,成员方法都是一样,是对应的抽象的总结自然也表示一个类

    方式2:数据类型(基本类型引用类型)的静态属性class

              Class  c3= Person.class;

               System.out.println(c == c3);// true   虽然获取Class对象的方式不一样,但是Class类是抽象总结,自然也表示一个类

             类似有Class c1 = int.class;

                      Class c2 = String.class;

    方式3:Class类中的静态方法

          public  static  Class forName(String  className)

    使用:

              Class  c4 = Class.forName("cn.himi.Person");

              System.out.println(c == c3);// true   虽然获取Class对象的方式不一样,但是Class类是抽象总结,自然也表示一个类

    特别注意的是:forName方法的参数为全路径,就是  "包名+类名",就比如这里的cn.himi.Person

    (3)开发时候使用方式3:

    为什么呢? 因为第三种是一个字符串,而不是一个具体的类名。这样我们就可以把这样的字符串配置到配置文件

     1 package cn.itcast_01;
     2 
     3 /*
     4  * 反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。
     5  * 
     6  * Person p = new Person();
     7  * p.使用
     8  * 
     9  * 要想这样使用,首先你必须得到class文件对象,其实也就是得到Class类的对象。所有的Class文件都是Class类的对象
    10  * Class类:
    11  *         成员变量    类Field,通过这个表示成员变量的类的对象,去调成员变量
    12  *         构造方法    类Constructor,通过这个表示构造方法的类的对象,去调构造方法
    13  *         成员方法    类Method,通过这个表示成员方法的类的对象,去调成员方法
    14  * 也就是Class类是其他类的抽象总结,它里面的成员变量,构造方法,成员方法都是一样,是对应的抽象的总结,自然也表示一个类。类中成员也是类
    15  * 获取class文件对象的方式:
    16  * A:Object类的getClass()方法
    17  * B:数据类型的静态属性class
    18  * C:Class类中的静态方法
    19  *         public static Class forName(String className)
    20  * 
    21  * 一般我们到底使用谁呢?
    22  *         A:自己玩    任选一种,第二种比较方便
    23  *         B:开发    第三种
    24  *             为什么呢?因为第三种是一个字符串,而不是一个具体的类名。这样我们就可以把这样的字符串配置到配置文件中。
    25  */
    26 public class ReflectDemo {
    27     public static void main(String[] args) throws ClassNotFoundException {
    28         // 方式1
    29         Person p = new Person();
    30         Class c = p.getClass();
    31 
    32         Person p2 = new Person();
    33         Class c2 = p2.getClass();
    34 
    35         System.out.println(p == p2);// false
    36         System.out.println(c == c2);// true
    37 
    38         // 方式2
    39         Class c3 = Person.class;
    40         // int.class;
    41         // String.class;
    42         System.out.println(c == c3);
    43 
    44         // 方式3
    45         // ClassNotFoundException,必须带包名的全路径,比如如果是Class c4 = Class.forName(“Person”);这样是不行的
    46         Class c4 = Class.forName("cn.itcast_01.Person");
    47         System.out.println(c == c4);
    48     }
    49 }
  • 相关阅读:
    每日日报2020.12.1
    每日日报2020.11.30
    981. Time Based Key-Value Store
    1146. Snapshot Array
    565. Array Nesting
    79. Word Search
    43. Multiply Strings
    Largest value of the expression
    1014. Best Sightseeing Pair
    562. Longest Line of Consecutive One in Matrix
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4564688.html
Copyright © 2011-2022 走看看