• java语言反射的概述以及三种获取字节码文件对应的Class类型的对象的方式


    反射的概述:
      JAVA反射机制是在运行状态中,
      对于任意一个类,都能够知道这个类的所有属性和方法(动态获取的信息);
      对于任意一个对象,都能够调用它的任意一个方法和属性(动态调用对象的方法);
      这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制

      简言之:通过字节码文件对象,去使用该文件中的成员变量、构造方法、成员方法。

    三种获取字节码文件对应的Class类型的对象的方式

      要想解剖一个类,必须先要获取到该类的字节码文件对象
      而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象

      .class文件   --> Class类
        成员变量    --> Field类
        构造方法    --> Constructor类
        成员方法    --> Method类

    获取class文件对象的方式:
        1:Object类的getClass()方法
        2:数据类型的静态属性class(任意数据类型都具备一个class静态属性)
        3:Class类中的静态方法(将类名作为字符串传递给Class类中的静态方法forName)
          public static Class forName(String className)
    
        1:Person p = new Person();
          Class c = p.getClass();
    
        2:Class c2 = Person.class;
          任意数据类型都具备一个class静态属性,看上去要比第一种方式简单。
    
        3:将类名作为字符串传递给Class类中的静态方法forName()即可。
          注意:需要类的全路径(带包名的路径)
          Class c3 = Class.forName("Person");
            
        4:第三种和前两种的区别        
            前两种你必须明确Person类型。
            第三种需要这种类型的字符串就行(开发中用)。
            这种扩展更强,不需要知道具体的类,只提供字符串,按照配置文件加载就可以了。

    示例代码如下:

     1 package cn.itcast_01;
     2 
     3 /*
     4  * 反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。
     5  * 
     6  *         Person p = new Person();
     7  *         p.使用;
     8  * 
     9  * 要想这样使用,首先你必须得到class文件对象,其实也就是得到Class类的对象。
    10  *         .class文件    -->    Class类
    11  *             成员变量        -->    Field类
    12  *             构造方法        -->    Constructor类
    13  *             成员方法        -->    Method类
    14  * 
    15  * 获取class文件对象的方式:
    16  *         A:Object类的getClass()方法
    17  *         B:数据类型的静态属性class(任意数据类型都具备一个class静态属性)
    18  *         C:Class类中的静态方法(将类名作为字符串传递给Class类中的静态方法forName)
    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         // 方式A
    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         // 方式B
    39         Class c3 = Person.class;
    40         // int.class;
    41         // String.class;
    42         System.out.println(c == c3); // true
    43 
    44         // 方式C
    45         // ClassNotFoundException 需要类的全路径(带包名的路径)
    46         Class c4 = Class.forName("cn.itcast_01.Person");
    47         System.out.println(c == c4); // true
    48     }
    49 }
  • 相关阅读:
    request.getParameter() 、 request.getInputStream()和request.getReader() 使用体会
    HTTP之Content-Length
    关于spring3中No Session found for current thread!and Transaction的配置和管理(转)
    Java数据类型和MySql数据类型对应一览
    Spring MVC 解读——View,ViewResolver(转)
    LeetCode 441. Arranging Coins
    LeetCode 415. Add Strings
    LeetCode 400. Nth Digit
    LeetCode 367. Valid Perfect Square
    LeetCode 326. Power of Three
  • 原文地址:https://www.cnblogs.com/chenmingjun/p/8810871.html
Copyright © 2020-2023  润新知