zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Canvas文本绘制
    Canvas贝塞尔三级曲线
    Canvas贝塞尔二级曲线
    Canvas arcTo绘制圆弧
    mybatis springmvc调用oracle存储过程,返回记录集
    java调用oracle存储过程,返回结果集
    oracle存储过程返回结果集
    存储过程变量类型定义与表字段一致
    HTML5获取当前的经纬度坐标
    实现精灵沿着圆形轨迹运动
  • 原文地址:https://www.cnblogs.com/chenmingjun/p/8810871.html
Copyright © 2011-2022 走看看