反射的基础

1. 反射概述

1.1 反射概述

  1. 反射是指对于任何一个Class类,在"运行的时候"都可以直接得到这个类全部成分。
  2. 在运行时,可以直接得到这个类的构造器对象:Constructor
  3. 在运行时,可以直接得到这个类的成员变量对象:Field
  4. 在运行时,可以直接得到这个类的成员方法对象:Method
  5. 这种运行时动态获取类信息以及动态调用类中成分的能力称为Java语言的反射机制。

1.2 反射的关键:

反射的第一步都是先得到编译后的Class类对象,然后就可以得到Class的全部成分。

img

1.3 反射的基本作用、关键?

  1. 反射是在运行时获取类的字节码文件对象:然后可以解析类中的全部成分。
  2. 反射的核心思想和关键就是:得到编译以后的class文件对象。

2. 反射获取类对象

2.1 获取Class类对象

img

img

img

2.2 获取Class类的对象的三种方式

img

  1. Class类中的一个静态方法 : forName(全限名:包名 + 类名)
 // 1. Class类中的一个静态方法 : forName(全限名:包名 + 类名)
        Class c = Class.forName("com.north.reflect_class.Student");
        System.out.println(c);
  1. 类名.class
Class c1 = Student.class;
        System.out.println(c1);
  1. 对象.getClass() 获取对象对应类的Class对象
 // 3. 对象.getClass() 获取对象对应类的Class对象
        Student student = new Student();
        Class c2 = student.getClass();
        System.out.println(c2);

结果演示
img

3. 反射获取构造器对象

3.1 使用反射技术获取构造器对象并使用

img

反射的第一步是先得到类对象,然后从类对象中获取类的成分对象。
Class类中用于获取构造器的方法

img

package com.north.reflect_constructor;

import org.junit.Test;

import java.lang.reflect.Constructor;

public class TestStudent01 {
    /**
     *  1. getConstructors
     *  获取全部的构造器 , 只能获取public 修饰的构造器
     *  Constructors[] getConstructors()
     */
    @Test
    public void getConstructors() {
        // a. 第一步 : 获取类对象
        Class c = Student.class;
        // b. 提取类中的全部的构造器对象
        Constructor[] constructors = c.getConstructors();
        // c. 便利构造器
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getName() + "==>" + constructor.getParameterCount());
        }
    }

    /**
     * 2. getDeclareConstructors();
     * 获取全部的构造器 , 只要你敢写 , 这里就能拿到 , 无所谓权限是否可见
     */
    @Test
    public void getDeclareConstructors() {
        // a. 第一步 : 获取类对象
        Class c = Student.class;
        // b. 提取类中的全部的构造器对象
        Constructor[] constructors = c.getDeclaredConstructors();
        // c. 便利构造器
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getName() + "==>" + constructor.getParameterCount());
        }
    }

    /**
     * 3.getConstructor();
     * 返回单个构造器对象(只能拿public的)
     */

    @Test
    public void getConstructor() throws Exception {
        // a. 第一步 : 获取类对象
        Class c = Student.class;
        // b. 定位单个构造器对象(按照参数定位无参构造器)
        Constructor cons = c.getConstructor();
        System.out.println(cons.getName() + "==>" + cons.getParameterCount());
    }

    /**
     * 4. getDeclaredConstructor
     *  获取某个构造器 , 只要你敢写 , 这里就能拿到 , 无所谓权限是否可见
     */
    @Test
    public void getDeclaredConstructor() throws NoSuchMethodException {
        // a. 第一步 : 获取类对象
        Class c = Student.class;
        // b. 定位单个构造器对象(按照参数定位无参构造器)
        Constructor cons = c.getDeclaredConstructor();
        System.out.println(cons.getName() + "==>" + cons.getParameterCount());
    }
}

3.2 使用反射技术获取构造器对象并使用

获取构造器的作用依然是初始化一个对象返回。

3.3 Constructor类中用于创建对象的方法

img

3.4 总结

img

4. 反射获取成员变量对象

img

4.1 使用反射技术获取成员变量对象并使用

反射的第一步是先得到类对象,然后从类对象中获取类的成分对象。
Class类中用于获取成员变量的方法

img

4.2 使用反射技术获取成员变量对象并使用

获取成员变量的作用依然是在某个对象中取值、赋值

4.3 Field类中用于取值、赋值的方法

img

4.4 总结

img

5. 反射获取方法对象

img

5.1 使用反射技术获取方法对象并使用

反射的第一步是先得到类对象,然后从类对象中获取类的成分对象。
Class类中用于获取成员方法的方法

img

5.2 使用反射技术获取方法对象并使用

获取成员方法的作用依然是在某个对象中进行执行此方法

5.3 Method类中用于触发执行的方法

img

5.4 总结

img

6. 反射的作用-绕过编译阶段为集合添加数据

反射是作用在运行时的技术,此时集合的泛型将不能产生约束了,此时是可以为集合存入其他任意类型的元素

ArrayList<Integer> list = new ArrayList<>();
list.add(100);
// list.add("North"); 
list.add(99);

泛型只是在编译阶段可以约束集合只能操作某种数据类型,在编译成Class文件进入运行阶段的时候,其真实类型都是ArrayList了,泛型相当于被擦除了。

6.1 反射为何可以给约定了泛型的集合存入其他类型的元素?

编译成Class文件进入运行阶段的时候,泛型会自动擦除。
反射是作用在运行时的技术,此时已经不存在泛型了。

7. 反射的作用?

img
作某种数据类型,在编译成Class文件进入运行阶段的时候,其真实类型都是ArrayList了,泛型相当于被擦除了。

6.1 反射为何可以给约定了泛型的集合存入其他类型的元素?

编译成Class文件进入运行阶段的时候,泛型会自动擦除。
反射是作用在运行时的技术,此时已经不存在泛型了。

7. 反射的作用?

[外链图片转存中…(img-u5kpOFUC-1668943731005)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值