JAVA反射总结学习

  • 初始反射
  • 反射的基本操作
  • 反射安全性问题

反射是指在Java运行状态中:

  1. 给定一个类对象(Class对象),通过反射获取这个类对象(Class对象)的所有成员结构;

  2. 给定一个具体的对象,能够动态地调用它的方法及对任意属性值进行获取和赋值;

  3. 这种动态获取类的内容、创建对象、以及动态调用对象方法及操作属性的机制,就叫做Java的反射机制。

优点

  • 增加程序的灵活性,避免将固有的逻辑程序写死到代码里

  • 代码简洁,可读性强,可提高代码的复用率

缺点

  • 相较直接调用在创建对象比较多的情景下反射性能下降

  • 内部暴露和安全隐患(破坏单例)

反射性能慢原因

  • 寻找类Class字节码的过程,比如通过ClassName找到对应的字节码Class,然后进行加载、解析,也会比较慢,而new的方式则无需寻找,因为在Linking的解析阶段已经将符号引用转为了直接引用

  • 安全管理机制的权限验证等等

  • 若需要调用native方法调用时JNI接口的使用

  • 入参校验

在这里插入图片描述

获取Class对象的四种方式:

  1. 通过ClassLoader对象的loadClass()方法。
  2. 使用类名.class。
  3. 使用Class.forName()。
  4. 通过对象调用getClass()方法
    在这里插入图片描述

基本信息操作

// 获取类修饰符
int modifiers = clazz.getModifiers(); 
// 获取类包名
Package aPackage = clazz.getPackage(); 
// 获取类的全路径名称
String fullClassName = clazz.getName(); 
// 获取类的简单名称
String simpleName = clazz.getSimpleName(); 
// 获取类加载器
ClassLoader classLoader = clazz.getClassLoader();
// 获取类实现的接口列表
Class[] interfaces = clazz.getInterfaces(); 
// 获取类的父类
Class superclass = clazz.getSuperclass(); // 获取类的注解信息
Annotation[] annotations = clazz.getAnnotations();

类的属性操作

Object instance = clazz.newInstance();
// 获取类中所有的共有字段 包含继承的字段
Field[] fields = clazz.getFields();
// 获取类中定义的字段 内部
Field[] declaredFields = clazz.getDeclaredFields();
// 获取指定名称的类中定义的字段
Field nameField = clazz.getDeclaredField("name");
// 获取字段的修饰符
int fieldModifiers = nameField.getModifiers();
// 指定字段强制访问
nameField.setAccessible(true);
// 修改字段你的值
nameField.set(instance, "samuel");
// 静态字段赋值
nameField.set(null, "静态字段赋值");

类的方法操作

// 静态字段赋值
Method[] methods = clazz.getMethods();
// 静态字段赋值
Method[] declaredMethods = clazz.getDeclaredMethods();
// 获取类中指定名称和参数的公有方法
Method say = clazz.getMethod("say", String.class);
// 获取类中指定名称和参数的公有方法
Method say1 = clazz.getDeclaredMethod("say");
// 获取方法的修饰符
int methodModifiers = say.getModifiers();
// 指定对象进行成员方法的调用
say.invoke(instance, "samuel666");
// 指定方法的强制执行
say.setAccessible(true);
// 静态方法调用
say.invoke(null);

类的构造器操作

//获取类中所有的公有构造器
Constructor[] cons = clazz.getConstructors(); 
//获取类中所有的构造器
Constructor[] cons1 = clazz.getDeclaredConstructors(); 
//获取类中无参的构造器
Constructor conNoParam= clazz.getDeclaredConstructor();
//获取类中有参构造
Constructor con= clazz.getDeclaredConstructor(String.class,String.class); 
//获取构造器的修饰符
int modifers = con.getModifiers(); 
//构造器实例对象
conNoParam.newInstance(); 
//指定方法的强制访问
con.setAccessible(true); 
//有参构造调用
con.newInstance("abc","bbb"); 
//class直接调用默认无参构造
Person.class.newInstance(); 

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

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

相关文章

[word] word如何打印背景和图片? #微信#其他#经验分享

word如何打印背景和图片? 日常办公中会经常要打印文件的,其实在文档的打印中也是有很多技巧的,可以按照自己的需求设定,下面给大家分享word如何打印背景和图片,一起来看看吧! 1、打印背景和图片 在默认的…

离线数仓(一)【数仓概念、需求架构】

前言 今天开始学习数仓的内容,之前花费一年半的时间已经学完了 Hadoop、Hive、Zookeeper、Spark、HBase、Flume、Sqoop、Kafka、Flink 等基础组件。把学过的内容用到实践这是最重要的,相信会有很大的收获。 1、数据仓库概念 1.1、概念 数据仓库&#x…

在gtkmm4 中检索子控件 (children)

文章目录 前言源代码 前言 gtkmm4.10已经没有控件的 get_children() 方法了但引进了observe_children() 但这个如其名字一样, 不能对子控件作修改 可以用它返回的对象.get_n_items() 获取子控件的数量还有如下的代替 get_first_child() : 如果只有一个child 则first与last返回…

typedef关键词的使用

typedef的应用 typedef定义函数数组 定义表达式 typedef <元素类型关键字><数组类型名>[<常量表达式>];例如: (1) typedef int vector[10]; (2) typedef char strings[80]; (3) typedef short int array[N]; 第一条语句定义了一个元素类型为int,含有…

《动手学深度学习(PyTorch版)》笔记8.3

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

从 F-Droid 安装 termux

Installing from F-Droid - Termux Wiki 如何从 F-Droid 安装 Termux 应用&#xff1a; 点击此链接&#xff0c;在 Android 或 Chrome OS 设备上打开 F-Droid。点按下载 APK&#xff0c;点击设备上下载的APK&#xff0c;点击允许安装来自未知来源的应用程序&#xff08;无论如…

【开源】JAVA+Vue.js实现计算机机房作业管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登录注册模块2.2 课程管理模块2.3 课时管理模块2.4 学生作业模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程表3.2.2 课时表3.2.3 学生作业表 四、系统展示五、核心代码5.1 查询课程数据5.2 新增课时5.3 提交作…

【PyTorch][chapter 15][李宏毅深度学习][Neighbor Embedding-LLE]

前言&#xff1a; 前面讲的都是线性降维&#xff0c;本篇主要讨论一下非线性降维. 流形学习&#xff08;mainfold learning&#xff09;是一类借鉴了拓扑流行概念的降维方法. 如上图,欧式距离上面 A 点跟C点更近&#xff0c;距离B 点较远 但是从图形拓扑结构来看&#xff0c; …

「C++ 类和对象篇 10」初始化列表

目录 一、什么是初始化列表&#xff1f; 二、为什么需要初始化列表&#xff1f; 三、初始化列表怎么使用&#xff1f; 3.1 在构造函数中使用初始化列表 3.2 注意 3.3 结论 3.4 应用场景 四、初始化列表的初始化顺序 五、另一种初始化成员变量的方法 【总结】 一、什么是初始化…

C++入门篇(4)—— 类与对象(1)

目录 1.类的引入 2.类的定义 3.类的访问限定符 4.类的作用域 5. 类对象的存储方式 6. this指针 6.1 this指针的引入 6.2 this指针的特性 6.3有意思的面试题 1.类的引入 C语言struct 结构体中只能定义变量&#xff0c;而C中可以定义函数。 struct Date {void Init(int…

vue常用9个事件修饰符

第075个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&a…

vueRouter中Hash模式和History模式有什么区别

VueRouter是Vue.js官方推荐的前端路由库&#xff0c;它提供了一种方便的方式来构建单页应用&#xff08;SPA&#xff09;。在使用VueRouter时&#xff0c;我们可以选择不同的路由模式&#xff0c;其中最常见的是Hash模式和History模式。本文将深入探讨这两种模式的区别&#xf…

逐行拆解Guava限流器RateLimiter

逐行拆解Guava限流器RateLimiter 常见限流算法 计数器法 设置一个时间窗口内允许的最大请求量&#xff0c;如果当前窗口请求数超过这个设定数量&#xff0c;则拒绝该窗口内之后的请求。 关键词&#xff1a;时间窗口&#xff0c;计数器。 举个例子&#xff0c;我们设置1秒钟…

vue3 可视化大屏自适应屏幕组件

首先定义了一个名叫ScreenContainerOptions的组件&#xff0c;需要传的参数如下 export type ScreenContainerOptions {width?: string | numberheight?: string | numberscreenFit?: boolean // 是否开启屏幕自适应&#xff0c;不然会按比例显示 } 组件的主要代码如下 …

【sass】 中使用 /deep/ 修改 elementUI 组件样式报错

element plus 想要覆盖组件的样式&#xff0c;想到了/deep/样式穿透&#xff0c;但样式一直不生效&#xff0c;代码如下&#xff1a; <style scoped lang"sass"> .main_wrapper{padding: 0 53pxposition: relativetop: -20px } >>> .el-tabs__item{h…

CSS3 基本语法

CSS3 基本语法 1. CSS3 新增长度单位 rem 根元素字体大小的倍数&#xff0c;只与根元素字体大小有关。vw 视口宽度的百分之多少 10vw 就是视口宽度的 10% 。vh 视口高度的百分之多少 10vh 就是视口高度的 10% 。vmax 视口宽高中大的那个的百分之多少。&#xff08;了解即可&am…

JVM相关-JVM模型、垃圾回收、JVM调优

一、JVM模型 JVM内部体型划分 JVM的内部体系结构分为三部分&#xff0c;分别是&#xff1a;类加载器&#xff08;ClassLoader&#xff09;子系统、运行时数据区&#xff08;内存&#xff09;和执行引擎 1、类加载器 概念 每个JVM都有一个类加载器子系统&#xff08;class l…

Spring Batch 批处理框架适配达梦数据库,实现从文件批量读取写入数据库(完整教程)

效果展示(达梦数据库): 技术简介: Spring Batch 是一个基于 Spring 的批处理框架,用于开发和执行大规模、高性能、可靠的批处理应用程序。它提供了丰富的功能和组件,用于处理复杂的批处理任务,例如大数据ETL(Extract-Transform-Load)、数据清洗、数据迁移、报表生成…

使用python编写GUI(图像用户界面)_PDF转图片(成功)

在这篇文章中,我们将讨论如何使用Python中的PyMuPDF库和Tkinter GUI库来创建一个简单的应用程序,该应用程序可以将PDF文件中的页面转换为图片。这个过程分为几个步骤,包括安装必要的库、创建GUI界面、实现文件选择和保存逻辑,以及PDF到图片的转换过程。 环境准备 首先,确…

C# OCR识别图片中的文字

1、从NuGet里面安装Spire.OCR 2、安装之后&#xff0c;找到安装路径下&#xff0c;默认生成的packages文件夹&#xff0c;复制该文件夹路径下的 6 个dll文件到程序的根目录 3、调用读取方法 OcrScanner scanner new OcrScanner(); string path "C:\1.png"; scann…