反射

反射

——框架设计的灵魂

反射:将类的各个组成部分封装为其他对象。

优点:

  • 可以在程序运行过程中,操作这些对象
  • 可以接耦,提高程序可扩展性

获取Class对象的三种方式

  • Class.forName("全类名")将字节码文件加载进内存,返回Class对象

    多用于配置文件,将类名定义在配置文件中。读取文件,加载类。

  • 类名.class通过类名的属性class获取

    多用于参数传递

  • 对象.getClass()该方法在Object中定义了

    多用于对象获取字节码

这三种方式分别对应了java代码的三个时期

同一个字节码(.class)文件在一次程序运行过程中,只会被加载一次,不论通过哪种方式获得的class对象都是同一个。

Class对象功能

获取功能

  • 成员变量

    Field[] getFields()获取所有public修饰的成员变量

    Field getField(String name)获取指定名称的public修饰的成员变量

    Field[] getDeclaredFields()获取所有成员变量,不考虑修饰符

    Field getDeclaredField(String name)获取指定成员变量,不考虑修饰符

    对于非public的变量,在使用前,需要忽略访问权限修饰符的安全检查field.setAccessible(true)也称暴力反射

  • 构造方法

    Constructor<?>[] getConstructors()

    Constructor<T> getConstructor(Class<?>... var1)

    Constructor<?>[] getDeclaredConstructors()

    Constructor<T> getDeclaredConstructor(Class<?>... var1)

  • 成员方法

    Method[] getMethods()

    Method getMethod(String var1, Class<?>... var2)

    Method[] getDeclaredMethods()

    Method getDeclaredMethod(String var1, Class<?>... var2)

  • 类名

    String getName()

通俗地讲,反射就是将传统的对象调用方法、访问变量的执行过程,在形式上转换为了方法、变量拿到自己所属的对象然后去执行操作。

  • Field:成员变量

    • 设置值

      void set(Object var1, Object var2)

    • 获取值

      Object get(Object var1)

    • 忽略访问权限修饰符的安全检查

      void setAccessible(boolean var1)

  • Constructor:构造方法

    • 创建对象

      newInstance(Object... var1)

      如果使用空参数构造方法创建对象,操作可以简化:用Class对象的newInstance()

  • Method:方法对象

    • 执行方法

      invoke(Object var1, Object... var2)

    • 获取方法名称

      String getName()

案例

  • 需求:写一个“框架”,在不能改变该类的任意代码的前提下,可以创建任意类的对象,并且执行其中任意方法
  • 实现:
    • 配置文件
    • 反射
  • 步骤
    • 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
    • 在程序中加载读取配置文件
    • 使用反射技术来加载类文件进内存
    • 创建对象
    • 执行方法
posted @   Lerjiu  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示