当前位置 : 主页 > 编程语言 > java >

Java-反射

来源:互联网 收集:自由互联 发布时间:2022-07-04
一,类的加载 当程序要使用某一个类时,如果该类还没有进入到内存,那么系统会通过加载,连接,初始化 加载:将类的class文件读取到内存中,并为它创建一个 Class 对象,任何类被

一,类的加载

当程序要使用某一个类时,如果该类还没有进入到内存,那么系统会通过加载,连接,初始化

  • 加载:将类的class文件读取到内存中,并为它创建一个 Class 对象,任何类被加载后都会创建唯一的一个 Class 对象
  • 连接:校验类的内部结构是否正确;为静态成员分配内存。
  • 初始化:创建对象

  • 二,类加载器

    类加载器负责将 .class 文件加载到内存中,并为它生成对应的 Class 对象

    三,反射

    概念:Java的反射机制是指,程序在运行状态下,对于任何一个类,都能知道这个类中的所有属性和方法;对于任何一个对象,都能调用它的任意一个属性和方法。这种动态获取信息以及动态调用属性和方法的功能就称为反射。

    注:要剖析一个类的内部结构,必须先得到这个类的字节码文件对象

    四,字节码文件对象的获取

  • 通过对象获取
  • 通过类名获取
  • 通过 Class 类中的静态方法获取
  • // 1.
    Person p = new Person();
    Class c1 = p.getClass();
    System.out.println(c1);

    System.out.println("-------------------------------");

    // 2.
    Class c2 = Person.class;
    System.out.println(c2);

    System.out.println("-------------------------------");

    // 3.
    // 类名必须写成全限定类名(全类名)
    Class c3 = Class.forName("com.qf.test1.Person");
    System.out.println(c3);


    五,通过反射获取构造方法,并创建对象

    通过 Class 对象可以调用以下方法获取构造器对象:

  • getConstructors():返回非私有的构造函数对象组成的数组
  • getDeclaredConstructors():返回所有构造函数对象组成的数组(包括私有的)
  • getConstructor(Class…c):获取非私有的指定参数的构造函数对象
  • getDeclaredConstructor(Class…c):获取指定参数的构造函数对象(包括私有的)
  • 通过构造器对象可以创建对象:

  • newInstance(Object… o):根据指定构造器的参数传入实参创建该类对象
  • setAccessible(boolean b):暴力反射,取消私有化,不建议使用,因为破坏了封装性
  • 注:Class 中也有 newInstance() 方法来创建该类对象,但是只能通过默认的构造函数来创建对象

    六,通过反射获取成员变量,并赋值

    通过 Class 对象可以调用以下方法获取属性对象:

  • getFields():返回非私有的属性对象组成的数组
  • getDeclaredFields():返回所有属性对象组成的数组(包括私有的)
  • getField(String name):通过属性名获取非私有的指定参数的属性对象
  • getDeclaredField(String name):通过属性名获取指定参数的属性对象(包括私有的)
  • 通过属性对象可以为指定对象的该属性赋值:

  • set(Object obj,Object value)
  • setAccessible(boolean b)

  • 七,通过反射获取成员方法,并调用

    通过 Class 对象可以调用以下方法获取方法对象:

  • getMethods():返回非私有的方法对象组成的数组(包括继承下来的)
  • getDeclaredMethods():返回所有方法对象组成的数组(包括私有的,不包括继承下来的)
  • getMethod(String name, Class…c):通过方法名和参数列表获取非私有的指定参数的方法对象
  • getDeclaredMethod(String name, Class…c):通过方法名和参数列表获取指定参数的方法对象(包括私有的)
  • 通过方法对象调用 invoke() 来执行该功能:

  • invoke(Object obj, Object…o)
  • setAccessible(boolean b)


  • 上一篇:Java-包和导入、范围修饰符、静态
    下一篇:没有了
    网友评论