【Java八股文总结】之反射

news2025/1/15 20:33:53

文章目录

    • Java反射
      • 一、泛型
        • 1、何为泛型?
        • 2、泛型通配符
          • Q:泛型擦除是什么?
        • 3、泛型上限和下限
      • 二、反射
        • 1、何为反射?
        • 2、反射有什么用?
        • 3、反射应用场景有哪些?
          • Q:反射的优缺点?
        • 4、反射获取Class类对象的4种方式
        • 5、反射API有几类?
        • 6、反射获取实例化对象
      • 三、代理模式
        • 1、代理模式
        • 2、静态代理
        • 3、动态代理
          • 1、JDK动态代理机制
            • Q:为什么 JDK 动态代理要基于接口实现?而不是基于继承来实现?
            • Q:JDK 动态代理中,目标对象调用自己的另一个方法,会经过代理对象吗?
            • Q:为什么不使用静态代理而使用动态代理?
          • 2、CGLIB动态代理机制
          • 3、JDK动态代理和CGLIB动态代理比较
          • 4、静态代理和动态代理比较
      • 四、注解
        • 1、何为注解?
          • Q:注解的解析方法有?

Java反射

一、泛型

1、何为泛型?

泛型(Generics),是指在定义时不指定信息的具体数据类型,而是暂时用一个 标识符 来代替,当外部实例化对象的时候再来指定具体的数据类型 (定义时不指定,使用标识符代替,使用时指定)。
优点: 极大提升程序的灵活性,提升类/接口的拓展性,泛型可以指代类中成员变量的数据类型,方法的返回值类型以及方法的参数类型。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、泛型通配符

? 表示可以任意类型的泛型对象。

Q:泛型擦除是什么?

所谓的泛型擦除,官方名叫“类型擦除”。
Java的泛型是伪泛型,这是因为Java在编译期间,所有的类型信息都会被擦掉。
也就是说,在运行的时候是没有泛型的

3、泛型上限和下限

  1. 泛型上限(最大类型,小于等于上限才可以):表示实例化时具体的数据类型,可以是 上限类型的子类或者时上限类型本身 ,用 extends 表示。
    使用:类名 <泛型标识 extends 上限类名>
  2. 泛型下限(最小类型,大于等于下限都可以):表示实例化时具体的数据类型,可以是 下限类型的父类或者是下限类型本身,用 super 表示。
    使用:类名 <泛型标识 super 下限类名>

二、反射

1、何为反射?

JAVA反射机制是在 运行状态 中,对于任意一个类,都能够知道这个 类的所有属性和方法 ;对于任意一个对象,都能够调用它的任意一个方法和属性;这种 动态获取的信息以及动态调用对象方法的功能 称为java语言的反射机制。
反射就是在运行时获取类的 所有属性和方法(如构造器、成员变量、成员方法),得到编译后的class文件对象 是Java反射的核心。

2、反射有什么用?

通过java语言中的反射机制可以 操作字节码文件(可以读和修改字节码文件。)通过反射机制可以操作代码片段(class文件)。

3、反射应用场景有哪些?

如常见的 SSM框架中、动态代理、注解 等。
在这里插入图片描述

Q:反射的优缺点?

在这里插入图片描述

4、反射获取Class类对象的4种方式

在这里插入图片描述

5、反射API有几类?

在这里插入图片描述

反射 API 用来生成 JVM 中的 类、接口或对象 的信息。
① Class类: 反射的核心类,可以获取类的属性,方法等信息。
② Field类: Java.lang.reflect 包中的类,表示类的成员变量,可以用来获取和设置类中的属性值。
③ Method类: Java.lang.reflect 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。
④ Constructor类: Java.lang.reflect 包中的类,表示类的构造方法。
⑤ Annotation类: 类的注解。

6、反射获取实例化对象

取得Class类对象的一个最直接的好处就是 通过反射实例化对象,该方法为:

  • 对象.newInstance()
    注:newInstance()方法内部实际上调用了无参数构造方法,必须保证无参构造存在才可以 ,否则会抛出java.lang.InstantiationException异常。

三、代理模式

在这里插入图片描述
在这里插入图片描述
注意: JDK 动态代理有一个最致命的问题是其 只能代理实现了接口的类。(即一个类没有实现接口,那么JDK动态代理无法代理)

1、代理模式

在这里插入图片描述

2、静态代理

静态代理:手动编写代理类,实现接口(接口一旦改动,代理类和实现类都需要修改)

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

3、动态代理

动态代理是在 运行时 动态生成类字节码,并加载到JVM中,不需要手动创建代理类、实现接口,可以直接代理实现类。
常见的动态代理,如 JDK动态代理、CGLIB动态代理 等。
在这里插入图片描述

1、JDK动态代理机制

通过 反射 来接收被代理的类,在不改变原来目标方法功能的前提下,在代理中增强自己的功能代码。并且要求 被代理的类必须实现一个接口
JDK动态代理的核心 是InvocationHandler接口和Proxy类。

Q:为什么 JDK 动态代理要基于接口实现?而不是基于继承来实现?

答:因为JDK动态代理生成的对象 默认是继承代理Proxy ,Java不支持多继承,所以JDK动态代理要基于接口来实现。

Q:JDK 动态代理中,目标对象调用自己的另一个方法,会经过代理对象吗?

答:不会,内部调用方法使用的对象是目标对象本身,被调用的方法不会经过代理对象。

Q:为什么不使用静态代理而使用动态代理?

静态代理是代理类在编译期间就创建好了,在编译时就已经将接口,被代理类,代理类等确定下来。如果有很多类很多接口需要代理,那么就只能使用代码提前写死,不够灵活;
使用了动态代理之后,不需要手动创建代理类,全部交给代理去完成对代理类的创建,实现无侵入式的代码扩展,这也是符合面向对象编程原则的操作。
在这里插入图片描述
在这里插入图片描述

2、CGLIB动态代理机制

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

3、JDK动态代理和CGLIB动态代理比较
  • JDK动态代理只能代理实现了接口的类或者直接代理接口。而CGLIB可以代理未实现任何接口的类。另外,CGLIB动态代理是通过生成—个被代理类的子类来拦截被代理类的方法调用,因此不能代理声明为finall类型的类和方法。
  • 就二者的效率来说,大部分情况都是JDK动态代理要更优秀,随着JDK版本的升级,这个优势更加明显。
4、静态代理和动态代理比较
  • 灵活性: 动态代理更加灵活,不需要必须实现接口,可以直接代理实现类,并且可以不需要针对每个目标类都创建一个代理类。另外,静态代理中,接口一旦新增加方法,目标对象和代理对象都要进行修改,这是非常麻烦的!
  • JVM层面: 静态代理在编译时就将接口、实现类、代理类这些都变成了一个个实际的class文件。而动态代理是在运行时动态生成类字节码,并加载到JVM中的。

四、注解

1、何为注解?

注解是一种标记,使类或接口附加额外信息,帮助编译器和JVM完成一些特定功能,例如 @Override —— 标识一个方法是重写方法。
元注解 是自定义注解的注解,例如:
@Target : 约束作用位置;
@Rentention : 约束生命周期;
@Documented : 表明这个注解应该被 javadoc 记录。

注解生命周期有3大类,分别是:

  • RetentionPolicy.SOURCE:给编译器用的,不会写入class文件。
  • RetentionPolicy.CLASS:会写入class文件,在类加载阶段丢弃,也就是运行的时候就没这个信息了。
  • RetentionPolicy.RUNTIME:会写入class文件,永久保存,可以通过反射获取注解信息。
    在这里插入图片描述
Q:注解的解析方法有?

在这里插入图片描述

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

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

相关文章

三极管集电极电阻的作用

放大状态&#xff1a;电流信号转变为电压信号 饱和状态 ;发射极正偏&#xff0c;集电极反偏 当有无电阻的作用。当集电极有电阻时&#xff0c;可以得到随IC电流变化的电压信号&#xff0c;当工作在饱和状态。集电阻电阻越大。越容易进入饱和状态.当Ib有个小电流,Ic会出现大的…

Dubbo的SPI机制

目录 什么是 SPI Java SPI 示例 Java SPI 源码分析 想一下 Java SPI 哪里不好 Dubbo SPI Dubbo SPI 简单实例 Dubbo 源码分析 getExtensionClasses Adaptive 注解 - 自适应扩展 Adaptive 注解在类上 Adaptive 注解在方法上 WrapperClass - AOP injectExtension - …

webpack 官方文档解读一(详细使用教程) 起步

什么是webpack 就是个打包工具。通过一系列插件帮你优化项目&#xff0c;压缩&#xff0c;混淆等。总之什么脏活累活都能干。 入门案例 创建一个目录&#xff0c;并安装webpack和webpack-cli这两个包。webpack包是webpack本体&#xff0c;webpack-cli是他提供的工具包。 mk…

RTL8380M/RTL8382M管理型交换机系统软件操作指南二:转发表

前面介绍了端口配置,这次对转发表进行详细的描述&#xff0c;主要包括以下三方面内容&#xff1a;基础配置、转发表、删除1.1 基础配置 1.1.1 老化时间 老化时间是一个影响交换机学习进程的参数。从一个地址记录加入地址表以后开始计时&#xff0c;如果在老化时间内各端口未收…

ResNet网络详解

ResNet ResNet在2015年由微软实验室提出&#xff0c;斩获当年lmageNet竞赛中分类任务第一名&#xff0c;目标检测第一名。获得coco数据集中目标检测第一名&#xff0c;图像分割第一名。 ResNet亮点 1.超深的网络结构(突破1000层) 2.提出residual模块 3.使用Batch Normalizat…

java项目-第147期ssm社区生活超市管理系统_(spring+springmvc+mybatis+jsp)_java毕业设计_计算机毕业设计

java项目-第147期ssm社区生活超市管理系统_(springspringmvcmybatisjsp)_java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm社区生活超市管理系统》 该项目分为3个角色&#xff0c;管理员、用户、供应商角色。 用户可以浏览前台商品&#xff0c;进行…

[附源码]java毕业设计软件项目过程管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

牛客小白月赛 61 E 排队

题目大意&#xff1a; n个数&#xff0c;共有n&#xff01;种排列方式&#xff0c;记Pi(a)表示序列a的第i种排队方式&#xff0c;cnt(Pi(a))表示P(i)的逆序对个数&#xff0c;PLMM想知道这n&#xff01;种排列方式共有多少对逆序对 给定一个 nnn 个数&#xff0c;在所有排列顺序…

Windows 11 Insider Preview Build 25247.1000(rs_prerelease)更新内容

微软于今日推出了新的Dev预览版25247.1000&#xff0c;引入了电源设置的新能源建议&#xff0c;“帐户”页面现在会在 OneDrive 存储空间不足时显示警告。下面就和小编一起来看看详细的更新内容吧。 更新内容 此版本包括一些新功能&#xff0c;包括能源建议、任务管理器的一些改…

MySQL8.0优化 - 锁 - 从数据操作的类型划分:读锁、写锁

文章目录学习资料锁的不同角度分类锁的分类图如下从数据操作的类型划分&#xff1a;读锁、写锁读锁写锁锁定读MySQL8.0新特性写操作学习资料 【MySQL数据库教程天花板&#xff0c;mysql安装到mysql高级&#xff0c;强&#xff01;硬&#xff01;-哔哩哔哩】 【阿里巴巴Java开…

【21-业务开发-基础业务-商品模块-分类管理-商品系统三级分类的新增类别前后端代码实现-商品系统三级分类的更新类别前后端代码实现-之前错误的Bug修正】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了&#xff0c;请点击这里&#xff01;】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

2022 全网最全最新 Java 面试题 - 独家内部教材

怎样才能拿到大厂的 offer&#xff0c;没有掌握绝对的技术&#xff0c;那么就要不断的学习 从疫情破局而出&#xff0c;又在毕业季一路过关斩将&#xff0c;我是如何笑面试官&#xff0c;拿到阿里&#xff0c;腾讯等八家大厂的 offer 的呢&#xff0c;在这里分享我的秘密武器&…

kubernetes(K8S)学习笔记P3:集群 YAML 文件(部署)

集群 YAML 文件&#xff08;部署&#xff09;4.集群 YAML 文件&#xff08;部署&#xff09;4.1 YAML 文件概述4.2YAML 文件书写格式4.2.1YAML 介绍4.2.2YAML 基本语法4.2.3YAML 支持的数据结构4.3资源清单描述方法4.3.1常用字段4.3.2字段解释4.4快速编写yml-->kubdectl cre…

数据结构由中序序列和后序序列构造二叉树

2022.11.19 由中序序列和后序序列构造二叉树任务描述相关知识编程要求测试说明C/C代码任务描述 本关任务要求采用中序遍历序列和后序遍历序列构造二叉树。 相关知识 给定一棵二叉树的中序遍历序列和后序遍历序列可以构造出这棵二叉树。例如后序序列是DEBFGCA&#xff0c;中序…

MySQL8.0优化 - 锁 - 从对待锁的态度划分:乐观锁、悲观锁

文章目录学习资料锁的不同角度分类锁的分类图如下从对待锁的态度划分&#xff1a;乐观锁、悲观锁悲观锁&#xff08;Pessimistic Locking&#xff09;乐观锁&#xff08;Optimistic Locking&#xff09;两种锁的适用场景学习资料 【MySQL数据库教程天花板&#xff0c;mysql安装…

Ajax笔记

Ajax笔记资源的请求方式一、概念1、Ajax作用2、jQuery中的Ajax二、$.get()函数的语法$.get()发起不带参数的请求$.get()发起带参数的请求三、$.post()函数的语法$.post()向服务器提交数据<font colorred>四、$.ajax()函数的语法使用$.ajax()发起GET请求使用$.ajax()发起P…

JSP使用

目录 简介 作用 创建 结构 常用脚本 声名脚本 表达式脚本 代码脚本 注释 九大内置对象 四大域对象 out与response.getWriter 静态引入 动态引入 EL表达式 作用 语法 取值顺序 获取指定参数 输出指定对象的数据 运算符 算数运算符 关系比较 逻辑运算符…

【Vue】使用 axios 发送ajax 请求

在 Vue 里面我们如何去发送一些 Ajax(阿贾克斯)请求 从远程的网站上获取一些数据。 假如我们有这样的接口的地址&#xff1a; https://www.xxxx.site 假设它是一个能跨域访问的接口。‍‍‍‍ 如果我们想去在我们的代码里面发这种请求&#xff0c;我该怎么做&#xff1f; 首…

Ubuntu 桌面系统升级

本文介绍 Ubuntu 桌面系统升级的两种方式&#xff0c;通过 UI 或命令行的方式&#xff0c;演示为 20.04 升级为 22.04。并介绍了 windows 的 Linux 子系统 wsl 的升级注意事项。 背景 之前在学习 ROS2 时&#xff0c;安装 ros-humble-desktop 出现依赖错误&#xff1a;无法修正…

[附源码]java毕业设计食材采购平台论文

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…