Java基础之反射机制

news2024/10/5 15:31:43

背景:Java程序中的所有对一项都有两种类型:编译时类型运行时类型(由于多态导致的),这可能会导致对象的编译时类型和运行时类型不一致。
反射(Reflection)是被是为动态语言的关键,反射机制允许程序再运行起家借助Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
加载完类之后,再堆内的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们称之为——反射
在这里插入图片描述
在这里插入图片描述
Java反射机制提供的功能:

  • 在运行时判断任意一个对象所属的类;
  • 在运行时构造任意一个类的对象;
  • 在运行时判断任意一个类所具有的成员变量和方法;
  • 在运行时获取泛型信息;
  • 在运行时调用任意一个对象的成员变量和方法;
  • 在运行时处理注解;
  • 生成动态代理

反射相关的主要API

  • java.lang.Class:代表一个类;
  • java.lang.reflect.Method:代表类的方法;
  • java.lang.reflect.Fild:代表类的成员变量;
  • java.lang.reflect.Constructor:代表类的构造器
    ……

反射的优缺点

  • 优点
    • 提高了Java程序的灵活性和扩展性,降低了耦合性,提高自适应能力;
    • 允许程序创建和控制任何类的对象,无需提前硬编码目标类。
  • 缺点
    • 反射的性能较低(反射机制主要应用在对灵活性和扩展性要求很高的系统框架上);
    • 反射会模糊程序内部逻辑,可读性较差。

面向对象中创建对象,调用指定结构(属性、方法)等功能,可以不适用反射,也可以使用反射,这两者的区别:

  • 不使用反射时,我们考虑封装性。比如出了类之后,就不能调用该类中的私有结构;
  • 使用反射,我们可以调用运行时类中(运行java代码过程中,加载到内存方法区的类)任意的构造器、属性、方法,包括了私有的属性、方法、构造器。

以前创建对象并调用方法的方式,与通过反射创建对象调用方法的方式对比的话,使用场景:

  • 从程序员开发者的角度来说,开发中主要是完成业务代码,对于相关的对象、方法的调用都是确定的。所以,使用非反射的方法多一些;
  • 因为反射体现了动态性(可以在运行时动态的获取对象所属的类,动态的调用相关的方法),所以在设计框架的时候,会大量的使用反射。意味着,需要学习框架的源码,那么就需要学习反射。(框架 = 注解+ 反射+ 设计模式)

通过反射,可以调用类中的私有结构,是否与面向对象的封装性是否有冲突?

  • 封装性:体现的是是否建议我们调用内部api的问题,比如private声明的结构,意味着不建议调用;
  • 反射:体现的是我们能否调用的问题。因为类的完整结构都加载到了内存中,所以我们有能力进行调用。

对Class类的理解
Class是反射的源头。
在这里插入图片描述
在这里插入图片描述
获取Class实例的几种方式:

  • 调用运行时类的静态属性:class。如: Class 变量名 = 类名.class;
  • 调用运行时类的对象的getClass()。如:Class 变量名 = 实例.getClass();
  • 调用Class的静态方法forName(String className)。如:Class 变量名 = Class.forName(“全类名”);
  • 使用类的加载器(了解,与前一种方式的使用场景相同)
    在这里插入图片描述
    哪些类型有Class对象
  • class:外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类;
  • interface:接口;
  • []:数组
  • enum:枚举
  • annotation:注解@interface
  • primitive type:基本数据类型
  • void
    简而言之,所有Java类。
    在这里插入图片描述
    类的加载过程
    在这里插入图片描述
    类加载器(JDK8版本为例):
    在这里插入图片描述
    在这里插入图片描述
    类加载器分类:
  • BootstrapClassLoader:引导类加载器、启动类加载器
  • 继承于ClassLoader的类加载器
    • ExtensionClassLoader:扩展类加载器;
    • SystenClassLoader/ApplicationClassLoader:系统类加载器、应用程序类加载器;
    • 用户自定义类的加载器
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1077483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

速通Redis基础(二):掌握Redis的哈希类型和命令

目录 Redis 哈希类型简介 Redis 哈希命令 HSET HGET HEXISTS HDEL HKEYS HVALS HGETALL HMGET HLEN HSETNX ​编辑 HINCRBY HINCRBYFLOAT Redis的哈希类型命令小结 Redis 是一种高性能的键值存储数据库,支持多种数据类型,其中之…

jdbc+数据连接池

1.1 JDBC概念 JDBC 就是使用Java连接并操作数据库的一套API 全称:( Java DataBase Connectivity ) Java 数据库连接 1.2 JDBC优势 可随时替换底层数据库,访问数据库的Java代码基本不变 以后编写操作数据库的代码只需要面向JDBC(接口&…

如何在Windows系统搭建VisualSVN服务并在公网远程访问【内网穿透】

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写,是一个开放源代码的版本控制系统…

尚品甄选2023全新SpringBoot+SpringCloud企业级微服务项目

最适合新手入门的SpringBootSpringCloud企业级微服务项目来啦!如果你已经学习了Java基础、SSM框架、SpringBoot、SpringCloud,想找一个项目来实战练习;或者你刚刚入行,需要可以写到简历中的微服务架构项目! 项目采用前…

大运新能源天津车展深度诠释品牌魅力 为都市人群打造理想车型

如今,新能源汽车行业发展潜力巨大,不断吸引无数车企入驻新能源汽车赛道,而赛道的持续紧缩也让一部分车企很难找到突破重围的机会。秉持几十年的造车经验,大运新能源凭借雄厚的品牌实力从一众车企中脱颖而出。从摩托车到重卡&#…

在两个有序数组中找整体第k小的数

一、题目 给定两个已经排序的数组(假设按照升序排列),然后找出第K小的数。比如数组A {1, 8, 10, 20}, B {5, 9, 22, 110}, 第 3 小的数是 8.。…

基于 Mtcnn(人脸检测)+Hopenet(姿态检测)+拉普拉斯算子(模糊度检测) 的人脸检测服务

写在前面 工作原因,顺便整理博文内容为一个 人脸检测服务分享以打包 Docker 镜像,可以直接使用服务目前支持 http 方式该检测器主要适用低质量人脸图片处理理解不足小伙伴帮忙指正,多交流,相互学习 对每个人而言,真正的…

11.动名词

一.什么是动名词 动名词是动词的另一种非谓语动词形式。动名词跟宾语或状语构成动名词短语,动名词跟动词不定式一样,都属于非谓语动词,不能作谓语,动名词或动名词短语可以作主语,表语,宾语,介词…

fastjson2与fury的巅峰对决,谁会笑到最后?

写在前面 两个月前,我们写过一篇关于fury和protostuff的性能对比的文章:谁才是真正的协议之王?fastjson2 vs fury,那时,两个协议框架各有千秋,不分伯仲,今天,看到fury推出了全新的0…

我用Python写了几个摸鱼小游戏,赐你2023年度上班上学摸鱼必备良品!(附源码)

文章目录 前言一丶超级玛丽二、沙漠打地鼠三、贪吃蛇四、坦克大战五、五子棋 前言 获取python整套完整教程,3263学习笔记,源码,项目实战,全部在手,python不愁~~~ Python学习资料点击领取福利 例如: 超级…

js高级(2)函数的柯里化,cookie的使用,10天免登录案例,购物车案例,拖动盒子小案例等等

1.函数的柯里化 自定义函数的柯里化 // 自定义函数的柯里化function curry(fn) {//判断输入的函数有几个参数let len fn.length;// 返回一个函数,并且有函数名为treturn function t() {// 获取到实参的个数let innerLength arguments.length// 获取到真实参数,转化为数组[.…

FPGA---UDP通信求助

项目场景: 使用UDP进行回环,网络调试助手,发送数据通过UDP接收模块接收,解析出数据,给到UDP发送模块,传回上位机。 问题描述 UDP接收模块中,接收到的CRC校验值与自己计算CRC校验值进行判断&am…

【电商API接口的应用:电商数据分析入门】初识Web API(一)

如何使用Web应用变成接口(API)自动请求网站到特定信息而不是整个网站,再对这些信息进行可视化。由于这样编写到程序始终使用最新到数据来生成可视化,因此即便数据瞬息万变,它呈现到信息也都是最新的。 使用Web API Web API是网站的一部分&am…

javapoet 注释中添加枚举值

问题描述 使用javapoet生成源代码 为了实现这么一个目的 解决 翻了一下源代码,他的实现如下: 这个方法是私有的,暂时不确定如何调用 照着这个方法,即可实现大多数类型的基本调用 即可实现上图需要的效果

为Yolov7环境安装Cuba匹配的Pytorch

1. 查看Cuba版本 方法一 nvidia-smi 找到CUDA Version 方法二 Nvidia Control Panel > 系统信息 > 组件 > 2. 安装Cuba匹配版本的PyTorch https://pytorch.org/get-started/locally/这里使用conda安装 conda install pytorch torchvision torchaudio pytorch-cu…

[华为认证]路由表和FIB表

路由器转发数据包的关键是路由表和FIB表,每个路由器都至少保存着一张路由表和一张FIB(Forwarding Information Base)表。路由器通过路由表选择路由,通过FIB表指导报文进行转发。 路由表 每台路由器中都保存着一张本地核心路由表&…

Java学数据结构(4)——PriorityQueue(优先队列) 二叉堆(binary heap)

前言 数据结构与算法作为计算机科学的基础,是一个重点和难点,在实际编程中似乎看不它们的身影,但是它们有随处不在,如影随形。 本系列博客是《数据结构与算法分析—Java语言描述》的读书笔记,合集文章列表如下&#…

delphi socket cross开源跨平台通讯库

delphi socket cross是Pascal开源跨平台的tcp通讯组件 windows下用的iocp linux下用的epoll 支持http,https 开源地址:GitHub - winddriver/Delphi-Cross-Socket: Delphi cross platform socket library 下图来自网络:

陪诊系统|陪诊系统解放繁琐,为陪诊添便利

在当代快节奏的生活中,随着医疗服务的不断发展,陪诊成为了越来越多人的需求。然而,传统的陪诊方式却存在着时间成本高、沟通不畅、服务体验差等问题。但近年来,陪诊小程序的兴起却为这一难题提供了创新的解决方案。 陪诊小程序&a…

Congestion Control for Large-Scale RDMA Deployments

文章目录 IntroductionDCQCNBuffer Setting Introduction PFC是粗粒度的流量控制机制,在端口层面发挥作用,不区别不同的流。这会导致很多弊端,比如不公平,受害流等。 解决PFC限制的解决方法是flow-level的拥塞控制,D…