五分钟学会反射

反射

1、反射的概述

反射:将类的各个组成部分封装为其他对象,这就是反射机制。
反射的优点:

  1. 可以在程序运行的过程中,操作这些对象。
  2. 可以解耦,提高程序的可扩展性。

2、 获取Class对象的三种方式

java代码在计算机中经历的阶段:三个阶段

Java代码在计算机中经历的三个阶段
在获取去Class对象之前,我们首先要明白,java代码在计算机中所经历的三个阶段
Source 源代码阶段 :就是我们在idea中所写的Java代码阶段(.java结尾的文件)
Class类对象阶段:是我们通过javac 命令去编译的字节码文件阶段(.class结尾的文件)
Runtime运行时阶段:运行时,将class文件加载到内存中去运行的阶段
相对应的,我们就可以针对java代码的各个阶段去获取class对象

获取Class对象的三种不同方式在这里插入代码片

        //方式一    通过  对象.getClass  来获取class对象 :getClass()方法在Object勒种定义着
        Class c1 = teacher.getClass();
        //方式二    通过  Class.forName(类的全路径名称)  来获取class对象:将字节码文件加载进内存
        Class c2 = Class.forName("reflect.Teacher");
        //方式三   通过   类名.class来获取class对象: 通过类名的属性class获取
        Class c3 = Teacher.class;
  1. Class.forName(“全类名”):将字节码文件加载进内存,返回class对象。
    所用于配置文件,将类名定义在配置文件中。读取文件,加载类
  2. 类名.class:通过类名的属性Class获取。
    多用于参数的传递
  3. 对象.getClass(): getClass()方法在Object类中定义着。
    多用于对象的获取字节码的方式
    class文件只被加载一次
    上述代码都返回true,说明是同一个class对象
    结论:同一个字节码文件(*.class)在一次程序运行的过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个Class对象。

3、Class对象功能

获取Class对象的功能

  1. 获取成员变量们
    Field[ ] getFields( )
    Field getField(String name)

    Field[ ] getDeclareFields( )
    Field getDeclareField(String name)

  2. 获取构造方法们
    Constructor<?>[ ] getConstructors( )
    Constructor getConstructor<类<?>…parameterTypes>

    Constructor getDeclaredConstructor(类<?>…parameterTypes)
    Constructor<?>[ ] getDeclaredConstructors( )

  3. 获取成员方法们
    Method[ ] getMethods( )
    Method getMethod(String name , 类<?>… parameterTypes )

    Method[ ] getDeclaredMethods( )
    Method getDeclaredMethod(String name, 类<?>…parameterTypes)

  4. 获取类名
    String getName( )

获取class功能的具体使用

  1. 获取成员变量们
    注意点:只能获取被public修饰的成员变量
    Field[ ] getFields( )
    Field getField(String name)
    获取成员变量们
    在这里插入图片描述
    注意点 : 获取所有的成员变量(不考虑修饰符)
    Field[ ] getDeclareFields( )
    Field getDeclareField(String name)

在这里插入图片描述
在这里插入图片描述
Field:成员变量
操作:
1. 设置值
void set(Object obj ,Object value)
2. 获取值
get (Object obj)
3. 忽略访问权限修饰符的安全检查
setAccessible(true) 暴力反射

  1. 获取构造方法们
    注意点 :获取构造方法就是要创建对象
    Constructor<?>[ ] getConstructors( )
    Constructor getConstructor<类<?>…parameterTypes>

在这里插入图片描述
在这里插入图片描述
Constructor:构造方法
创建对象:
T newInstance(Object… initargs)
如果使用空参构造方法创建对象,操作可以简化:Class对象的newInstance方法

  1. 获取成员方法们
    注意点:只能获取被public修饰的成员方法
    Method[ ] getMethods( )
    Method getMethod(String name , 类<?>… parameterTypes )
    在这里插入图片描述
    在这里插入图片描述
    注意点:获取所有的成员方法(不考虑修饰符)
    Method[ ] getDeclaredMethods( )
    Method getDeclaredMethod(String name, 类<?>…parameterTypes)
    在这里插入图片描述
    在这里插入图片描述
    Constructor:构造方法
    创建对象

Method:方法对象
执行方法:
Object invoke(Object obj,Object… args)
获取方法的名称
String getName

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值