反射机制.

news2024/9/21 10:44:21

文章目录

  • 概述
    • 两个疑问
    • 关于java.lang.Class的理解
  • 获取Class实例的方式
  • 哪些类型可以有Class对象
    • 了解类的加载器
  • 掌握加载配置文件的另一种方式
  • 创建运行时类的对象
  • 体会动态性
  • 获取运行时类的完整结构
  • 调用运行时类的制定结构
    • 每日一考
  • 动态代理

概述

1、反射是动态语言的关键
2、动态语言:通俗的说,就是代码在运行时可以根据某些条件改变自身结构,如python、PHP
静态语言:运行时结构不可变的语言就是静态语言,如Java、c++
Java不是动态语言,但其具有“准动态性”,因为反射机制,Java有一定的动态性

两个疑问

1、通过直接new的方式还有反射的方式都可以造对象,开发中用哪个?
建议用new;一般涉及动态性时,会用反射
2、封装性和反射机制是否矛盾,如何看待?

关于java.lang.Class的理解

1、类的加载过程:
程序在经过javac.exe命令后,会生成一个或多个字节码文件(.class结尾),接着我们使用java.exe命令对某个字节码文件进行解释运行(运行的是包含main方法所在类对应的字节码文件)。相当于将某个字节码文件加载到内存中,此过程成为类的加载。加载到内存中的类,称为运行时类,此运行时类,就作为Class的一个实例
换句话说,Class的实例就对应着一个运行时类

获取Class实例的方式

1、方式一:调用运行时类的属性:.calss

在这里插入图片描述

2、方式二、通过运行时类的对象,调用getClass方法

在这里插入图片描述

3、方式三、调用Class的静态方法forName(String classPath),classPath是指定类的全类名,即是包含包名在内的类的完整路径(使用频率高)

在这里插入图片描述

【补充】
加载到内存中的运行时类,会缓存一段时间。在此时间内,我们可以通过不同的方式获取运行时类

在这里插入图片描述
虽然获取的方式不同,但通过后面的两个system.out语句都返回true,能看出不同方式获取的都是同一个运行时类(比较的是地址)

4、方式四、使用类的加载器:ClassLoader(了解,前三种掌握)

在这里插入图片描述
其中,ReflectionTest是我们写代码所在的测试类的名字,所有的代码都写在当前包的ReflectionTest文件下
在这里插入图片描述

哪些类型可以有Class对象

在这里插入图片描述
【补充】数组元素的类型和维度一样的情况下,其对应的Class对象相同,是同一个

在这里插入图片描述
返回true

了解类的加载器

1、对于自定义类,使用系统类加载器进行加载
2、调用系统类加载器的getParent方法:获取扩展类加载器
3、调用扩展类加载器的getParent方法:无法获取引导类加载器
引导类加载器主要加载Java的核心类库,无法加载自定义的类

掌握加载配置文件的另一种方式

在这里插入图片描述

创建运行时类的对象

1、newInstance():调用此方法,创建对应的运行时类的对象,内部调用了运行时类的空参构造器
要想此方法正常创建运行时类的对象,要求:
①运行时类要有空参构造器
②空参构造器的访问权限得够,一般都设置为public
javabean中要求提供一个public的空参构造器,原因:
①便于通过反射,创建运行时类的对象
②便于子类继承此运行时类,调用super()时,父类有此构造器

在这里插入图片描述

体会动态性

在这里插入图片描述
根据运行时生成的随机数,才能够确定是创建哪个运行时类的对象(其实是创建类的对象,会将这个类加载到内存,然后就会产生一个对应的运行时类)

获取运行时类的完整结构

1、获取属性:
getFields():获取当前运行时类及其父类中声明为public的属性
getDeclaredFields():获取当前运行时类的所有属性,不考虑权限,不包含父类的属性
2、方法
getMethods():获取当前运行时类及其父类中声明为public的方法
getDeclaredMethods():获取当前运行时类中的所有方法,不包括父类
3、构造器
getConstructors():获取当前运行时类中声明为public的构造器,不包含父类的
getDeclaredConstructors():获取当前运行时类中所有的构造器
4、父类
getSuperclass()
5、带泛型的父类
getGenericSuperclass()
6、带泛型的父类的泛型
在这里插入图片描述
这里是因为父类中只有一个泛型,所以直接输出数组的0位置上的元素,其实应该遍历数组
注释掉的方法也可以得到结果,上下两种是不同的方式
7、接口
getInterfaces():获取运行时类的接口
8、包
getPackage():获取运行时类所在的包
9、注解
gatAnnotations():获取运行时类的注解

调用运行时类的制定结构

调用:属性、方法、构造器
1、如何操作运行时类的指定属性(掌握)
在这里插入图片描述
2、如何操作运行时类的指定方法(掌握)
①非静态方法:
在这里插入图片描述
②静态方法
showDesc是Person中的静态方法
在这里插入图片描述
3、如何操作运行时类的构造器(了解)
常用前面说的newInstance
在这里插入图片描述

每日一考

在这里插入图片描述

动态代理

1、静态代理举例
特点:代理类和被代理类在编译期间就确定下来了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、动态代理举例
特点:代理类在编译期间没有显式定义,而是在运行时根据传进来的被代理类的对象,动态的创建
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

使用Docker打包镜像并发布

1、docker介绍 Docker 是一个开源的应用容器引擎,以镜像的形式进行发布。docker的图标是一个大鲸鱼驮着许多集装箱在海上航行。大鲸鱼就是docker,集装箱就是一个个容器。容器是完全使用沙箱机制,相互之间不会有任何接口,每个容器都…

高级Spring之BeanFactory 与 ApplicationContext 的区别

ApplicationContext接口 SpringBootApplication public class A01 {private static final Logger log LoggerFactory.getLogger(A01.class);public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException {//启动SpringBoot程序…

Python Scipy 显著性检验

Scipy 显著性检验显著性检验(significance test)就是事先对总体(随机变量)的参数或总体分布形式做出一个假设,然后利用样本信息来判断这个假设(备择假设)是否合理,即判断总体的真实情…

Linux基本功系列之userdel命令实战

春节马上要到了,大街上到处都是张灯结彩,喜气洋洋的景象,你们那里也开始了吗? 文章目录一. userdel命令概述二. 语法格式及常用选项语法格式及常用参数三. 参考案例3.1 删除用户但不删除家目录等相关的文件3.2 把用户彻底删除3.3 …

【Linux05-进程控制】进程创建、进程等待、进程退出、进程程序替换(附简易shell实现)

前言 本期分享进程控制的内容。 博主水平有限,不足之处望请斧正! 进程的控制主要分为四点: 进程创建进程退出进程等待进程程序替换 进程创建 怎么创建 通过fork创建。 #fork 是什么 创建子进程的函数。(使用已经介绍过&am…

Python基础学习 -- 概念

一、变量python的变量定义起来比较随意,不用定义数据类型a123b"123"系统会自动识别a为数值,b为字符串二、关键字定义变量名字的时候,要避开下面的关键字,但是可以通过大小写区分,as123;#错误定义As123;print…

阿里云服务器ECS

云服务器 ECS云服务器ECS(Elastic Compute Service)是一种简单高效、处理能力可弹性伸缩的计算服务。帮助您构建更稳定、安全的应用,提升运维效率,降低IT成本,使您更专注于核心业务创新。为什么选择云服务器ECS选择云服…

音频如何分割成两段音频?这些实用方法值得收藏

有些时候,我们从网上下载的音频素材可能会出现体积较大、播放时间长等情况,而我们却只需要其中的一小段。这个时候我们就需要借助一些音频分割软件来将重要的音频片段提取出来,从而有助于缩小音频文件的占比以及存储。那么如何如何分割音频呢…

JVM进修之路(一)程序计数器与虚拟机栈

JVM 定义:JVM:Java Virtual Machine,也就是Java运行时所需要的环境(Java二进制字节码运行时所需要的环境) 好处: 1.java代码一次编写,跨平台运行 2.自动内存管理,垃圾回收 3.数组下标越界检查 4…

千锋Node.js学习笔记

千锋Node.js学习笔记 文章目录千锋Node.js学习笔记写在前面1. 认识Node.js2. NVM3. NPM4. NRM5. NPX6. 模块/包与CommonJS7. 常用内置模块1. url2. querystring3. http4. 跨域jsonpcorsmiddleware(http-proxy-middleware)5. 爬虫6. events7. File System…

Mysql常用命令练习(一)

Mysql常用命令练习(一)一、数据库的三层结构二、数据库2.1、创建数据库2.2、查看、删除数据库2.3、备份和恢复数据库三、表3.1、创建表mysql常用的数据类型(列类型)创建表查看表查看表结构练习3.2、修改表修改表名修改表的字符集添加列修改列删除列练习3…

轻量级网络模型ShuffleNet

在学习ShuffleNet内容前需要简单了解卷积神经网络和MobileNet的相关内容,大家可以去看我之前的一篇博客MobileNet发展脉络(V1-V2-V3),🆗,接下来步入正题~卷积神经网络被广泛应用在图像分类、目标检测等视觉…

易盾sdk引起项目的整体耗时问题?

大家好: 我是烤鸭。今年年初的时候,项目接入易盾sdk之后,随着接口调用次数增多(用到易盾sdk的接口),项目整体性能变差。写篇文章做个复盘记录,其实同事已经写过了,我借鉴部分再拓展一些。 问题描述 突然收…

【JavaEE初阶】第五节.多线程 ( 基础篇 ) 线程安全问题(上篇)

目录 文章目录 前言 一、线程安全的概述 1.1 什么是线程安全问题 1.2 存在线程安全问题的实例 二、线程安全问题及其解决办法 2.1 案例分析 2.2 造成线程不安全的原因 2.3 线程加锁操作解决原子性 问题 ; 2.3.1 什么是加锁 2.3.2 使用 synchronized关键字…

爆品跟卖商家必读:2023年快速入局TikTok选品5大关键

TikTok商业进程一直有在发展,开启东南亚小店,美国小店内邀……有吸引了不少外贸工厂和传统跨境电商卖家等玩家入局。2022年这一年,不管是直播带货,短视频带货,还是广告投流,数据都有新的变化。据报道&#…

Word 允许西文在单词中间换行,没用/无效 终极办法

有时在写论文中,英文的调整相当麻烦,为了节约版面,会设置允许西文在单词中间换行。但有时不希望这样,特别是在复制网上英文时,会出现单词分断换行情况,如何解决: 1.一般办法。 在Word选择要调整…

C规范编辑笔记(十)

往期文章: C规范编辑笔记(一) C规范编辑笔记(二) C规范编辑笔记(三) C规范编辑笔记(四) C规范编辑笔记(五) C规范编辑笔记(六) C规范编辑笔记(七) C规范编辑笔记(八) C规范编辑笔记(九) 正文: 又是新的一年,2023年的第一篇没想到隔了这么久…

MyBatis-Plus加密字段查询(密文检索)

MyBatis-Plus数据安全保护(加密解密)解释说明 1.字段加密后,数据库存储的字段内容为十六进制格式的密文2.条件查询时,若不对密文进行处理将无法匹配出想要的结果3.处理方式是借助SQL的AES_DECRYPT函数将密文解密后匹配4.SQL的解密函数只有AES_DECRYPT&am…

Java-流和IO

文章目录流InputStreamFileInputStream常用方法详情代码示例BufferInputStream常用方法详情代码示例OutputStreamFileOutputStream常用方法详情代码示例BufferedOutputStream常用方法详情代码示例ReadWriteJava的java.io库提供了IO接口,IO是以流为基础进行输入输出的…

云原生技能树-docker image 操作-练习篇

从Docker Hub 拉取已有镜像 一个Docker 镜像(image)包含了程序代码和程序运行所依赖的所有环境。 Docker 镜像一般存放在镜像仓库服务(Image Registry)里,默认的镜像仓库服务是Docker Hub。 用户可以制作、构建镜像、将镜像上传到镜像仓库服务,从而可以…