当前位置: 首页 > news >正文

java记录-反射

什么是反射

反射是一种让Java拥有一定动态性的机制,它允许程序在执行期间取得任何类的内部信息,并且直接操作任意对象的内部属性及方法

类加载

类加载后通过堆内存方法区的Class类型对象就能了解该类的结构信息,这个对象就像该类的一面镜子,通过这面镜子能够看到类的所有结构(无论是不是private的),所以称之为反射

某类需要被使用时,如果还未加载,系统会通过类的加载、类的连接和类的初始化三步来准备类,统称为类加载或类初始化

1. 加载:将class文件读入内存,创建一个java.lang.Class对象(任何类被使用时都会有)
2. 连接:验证内部结构,为类变量分配内存并赋默认值,将二进制数据的符号引用转为直接引用
3. 初始化:对类变量初始化(从祖宗类开始),如果类有初始化语句就依次执行

反射能做什么

在运行时

  • 判断对象的类
  • 构造任一类的对象
  • 判断任一类的成员变量和方法
  • 获取泛型信息
  • 调用任一对象的成员变量和方法
  • 处理注解
  • 动态代理

它可以动态创建对象和编译,但是反射实时给JVM需求会比直接操作慢

反射获取Class对象

Class.forName()方法通过反射直接获取test包下Dog类的Class对象

Class cls = Class.forName("test.Dog");

object.getClass()方法通过反射借助Dog类实例获取Dog类的Class对象

Class cls2 = (new Dog()).getClass();

用类名.class int[ ]也算

Class cls3 = Dog.class;

通过反射获得类的结构

调用缺省构造函数,返回Class对象的一个实例

Object istc = cls.newInstance();

获得该Class对象的实体(类,接口,数组类,void)名称

String name = cls.getName();

获得父类Class对象

Class<?> clsParent = cls.getSuperClass();

获得接口Class对象的数组

Class<?>[] Its = cls.getInterfaces();

获得该类的类加载器

ClassLoader cld = cls.getClassLoader();

获得该类Constructor对象的数组

Constructor[] constructors = cls.getConstructors();

获得一个Method对象,此对象形参为paramType

Method m = cls.getMethod(.......)

获得所有的Field属性/方法/构造器数组

Field[] fields = cls.getDeclaredFields();
Method[] methods = cls.getDeclaredMethods();
Constructor[] constructors = cls.getDeclaredConstructors();

获取public的属性/方法/构造器

Field[] fields = cls.getFields();
Method[] methods = cls.getMethods();
Constructor[] constructors = cls.getConstructors();

获取指定属性/方法/构造器

Field = cls.getField("name");
Method method1 = cls.getMethod("getName", null);
Method method2 = cls.getMethod("setName", String.class);
Constructor constructor = cls.getConstructor(String.class, int.class);//参数类型

类加载器(了解)

负责将.class文件加载入内存,并生成对应java.lang.Class对象
加载器机制:

  • 全盘负责:加载某个类时其关联的其他Class也由同一加载器加载
  • 父类委托:先让父类加载器加载,如果无法加载才自己加载
  • 缓存机制:缓存被加载过的Class,先找缓存,找不到再加载类二进制数据转换成Class对象并缓存

加载器类型:

  1. Bootstrap根类加载器,jvm内置加载器,不属于ClassLoader谱系,底层是C++,对开发者透明
  2. Plantform class loader平台类加载器,负责Java SE API的实现类和JDK特定运行时类
  3. System class loader应用程序类加载器,如果没有特别指定,则用户自定义的类加载器都以此类加载器作为父加载器。

类加载器流程

  1. 检测此Class是否载入过,即在缓冲区中是否有此Class,如果有直接进入第8步,否则进入第2步。
  2. 如果没有父类加载器,则要么Parent是根类加载器,要么本身就是根类加载器,则跳到第4步,如果父类加载器存在,则进入第3步。
  3. 请求使用父类加载器去载入目标类,如果载入成功则跳至第8步,否则接着执行第5步。
  4. 请求使用根类加载器去载入目标类,如果载入成功则跳至第8步,否则跳至第7步。
  5. 当前类加载器尝试寻找Class文件,如果找到则执行第6步,如果找不到则执行第7步。
  6. 从文件中载入Class,成功后跳至第8步。
  7. 抛出ClassNotFountException异常。
  8. 返回对应的java.lang.Class对象。

获取泛型

获取注解

看文档

相关文章:

java记录-反射

什么是反射 反射是一种让Java拥有一定动态性的机制&#xff0c;它允许程序在执行期间取得任何类的内部信息&#xff0c;并且直接操作任意对象的内部属性及方法 类加载 类加载后通过堆内存方法区的Class类型对象就能了解该类的结构信息&#xff0c;这个对象就像该类的一面镜子…...

这次彻底不需要账号了,无需魔法永久白嫖GPT

免费GPT 自GPT风靡以来&#xff0c;大家用的是不亦乐乎&#xff0c;你用他去解决过实际问题&#xff0c;你用他去写过代码&#xff0c;你用他去修改过bug&#xff0c;你用他去写过sql&#xff0c;你用他去画过图&#xff0c;你问过他你能想到的任何“刁钻”问题。 你&#xff…...

远程桌面连接是什么?如何开启远程桌面连接详细教程

远程桌面连接是一种非常方便的技术&#xff0c;它允许用户通过互联网在不同的计算机之间共享资源和访问数据。目前这个技术已经广泛地应用于企业、教育、医疗和其他领域&#xff0c;使得人们能够更高效地工作和学习。 这篇文章&#xff0c;我将解释远程桌面连接是什么&#xf…...

lua实战(2)

目录 值和类型子类型类型字符串type (v) 值和类型 Lua是一种动态类型语言。这意味着变量没有类型;只有价值观才有意义。该语言中没有类型定义。所有值都有自己的类型。 Lua中的所有值都是一等值。这意味着所有的值都可以存储在变量中&#xff0c;作为参数传递给其他函数&…...

UI自动化测试案例——简单的Google搜索测试

以下是一个UI自动化测试的经典案例&#xff1a; import unittest from selenium import webdriverclass GoogleSearchTest(unittest.TestCase):def setUp(self):# 创建Chrome浏览器实例self.driver webdriver.Chrome()self.driver.maximize_window() # 最大化浏览器窗口def t…...

C++之虚函数原理

对象数据和函数的存储方式 注意说的是对象。 C中的对象存储方式是 每个对象占用的存储空间只是该对象的数据部分&#xff08;虚函数指针和虚基类指针也属于数据部分&#xff09;&#xff0c;函数属于公共部分。 虚函数表 虚函数是通过虚函数表实现的。 C实现虚函数的方法是…...

Windows Information Protection(WIP)部署方案

目录 前言 一、方案准备工作 1、确定哪些数据需要保护 2、选择合适的加密方式...

细说Hibernate的缓存机制

Hibernate 的缓存机制主要包括一级缓存和二级缓存。 1. 一级缓存&#xff08;Session 缓存&#xff09;&#xff1a; 一级缓存是 Hibernate 的 Session 级别的缓存&#xff0c;与每个 Session 对象相关联。当您通过 Session 对象执行查询、保存或更新操作时&#xff0c;Hibern…...

初识C++之线程库

目录 一、C中的线程使用 二、C的线程安全问题 1. 加锁 2. 变为原子操作 3. 递归里面的锁 4. 定时锁 5. RAII的锁 三、条件变量 1. 为什么需要条件变量 2. 条件变量的使用 2.1 条件变量的相关函数 2.2 wait函数 一、C中的线程使用 线程的概念在linux中的线程栏已经…...

ChatGLM-LLaMA-chinese-insturct 学习记录(含LoRA的源码理解)

ChatGLM-LLaMA-chinese-insturct 前言一、实验记录1.1 环境配置1.2 代码理解1.2.1 LoRA 1.4 实验结果 二、总结 前言 介绍&#xff1a;探索中文instruct数据在ChatGLM, LLaMA等LLM上微调表现&#xff0c;结合PEFT等方法降低资源需求。 Github: https://github.com/27182812/Ch…...

JuiceFS-K8s部署

目录 1、部署JuiceFS-CSI驱动2、创建OBS认证信息Secret3、创建存储类4、创建PVC--PVC创建时会自动创建PV5、创建测试Pod--测试Pod创建容器内是否挂载成功 官网文档地址&#xff1a;https://juicefs.com/docs/zh/csi/introduction/ 1、部署JuiceFS-CSI驱动 部署yaml如下&#x…...

2023最新版本Camtasia电脑录屏软件好不好用?

在当今数字化时代&#xff0c;屏幕录制成为了许多用户制作教学视频、演示文稿、游戏攻略等内容的首选。本文将为您介绍几款常用的电脑录屏软件&#xff0c;包括Camtasia、OBS Studio、Bandicam等&#xff0c;并对其进行功能和用户体验方面的比较&#xff0c;同时给出10款电脑录…...

第三章 Linux 初步

第三章 Linux 初步 一、 基本操作 ①登录&#xff1a; Linux 是多用户系统&#xff0c;必须用正确的用户名和口令登录后才能 进入 Linux Shell 提示符状态。 默认的文本界面 Shell 提示符有两种&#xff1a; •root 用户登录后的提示符&#xff1a; # •普通用户登录后的…...

linux环境安装使用mysql详解

01-安装MySQL并启动 1.1 环境准备 # 1.卸载mariadb&#xff0c;否则安装mysql会出现冲突 &#xff08;1&#xff09;.执行命令rpm -qa | grep mariadb 会列出所有被安装的mariadb rpm 包&#xff1b; &#xff08;2&#xff09;.执行命令rpm -e --nodeps mariadb-libs-5.5.56…...

SUNTANS模型学习(9)——学习Tidal forcing算例

学习Tidal forcing算例 简介网格配置与地形定解条件设置初始条件设置边界条件设置开边界处的通量计算&#xff08;OpenBoundaryFluxes&#xff09;开边处的速度、水位&#xff08;BoundaryVelocities&#xff09; 其它参数配置模拟结果 简介 SUNTANS中 tidal forcing 算例的全…...

​力扣解法汇总1010. 总持续时间可被 60 整除的歌曲

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a; 力扣 描述&#xff1a; 在歌曲列表中&#xff0c;第 i 首歌曲的持续时间为 time[i] 秒。 返回其总持…...

利用老毛桃pe启动U盘启动ubuntu.iso,完成ubuntu系统的安装

1.双U盘&#xff0c;一个是老毛桃pe启动盘&#xff0c;可以启动grub4dos&#xff0c;加载了run模块&#xff0c;很好用&#xff08;尤其是对不熟悉grub的小白&#xff09; 2.大容量U盘存放ubuntu-desktop-i386.iso&#xff0c;U盘的格式是ntfs格式&#xff08;其实这个不好&am…...

分享2个教学视频录制的方法!

案例&#xff1a;如何录制教学视频&#xff1f; 【我是一名老师&#xff0c;我想录制一些教学视频发布在网络平台上&#xff0c;但是我不知道如何操作。有没有人知道录制教学视频需要什么工具&#xff1f;如何录制&#xff1f;】 随着在线教育的普及&#xff0c;越来越多的教…...

「SQL面试题库」 No_63 报告的记录 II

&#x1f345; 1、专栏介绍 「SQL面试题库」是由 不是西红柿 发起&#xff0c;全员免费参与的SQL学习活动。我每天发布1道SQL面试真题&#xff0c;从简单到困难&#xff0c;涵盖所有SQL知识点&#xff0c;我敢保证只要做完这100道题&#xff0c;不仅能轻松搞定面试&#xff0…...

【事务】怎么去理解事务?

1、什么是事务&#xff1f; 事务是指作为单个逻辑工作单元执行的一系列操作&#xff0c;这些操作要么全做&#xff0c;要么全不做&#xff0c;是一个不可分割的工作单元。 2、事务具有哪些特性&#xff1f; 一个逻辑工作单元要成为事务&#xff0c;在关系型数据库管理系统中…...

camunda流程变量如何使用

Camunda是一个流程引擎&#xff0c;它支持在流程执行期间存储和操作流程变量。流程变量是一个值或对象&#xff0c;可以与Camunda中的流程实例、任务或执行相关联。 流程变量在Camunda中有很多用途。以下是一些常见的用途&#xff1a; 1、传递数据&#xff1a;流程变量可以用于…...

CMIP6:WRF模式动力降尺度、单点降尺度、统计方法区域降尺度

专题一 CMIP6中的模式比较计划 1.1 GCM介绍 ​ 1.2 相关比较计划介绍 ​ 专题二数据下载 2.1方法一&#xff1a;手动人工 ​ 利用官方网站 2.2方法二&#xff1a;自动 利用Python的命令行工具 ​ 2.3方法三&#xff1a;半自动购物车 利用官方网站 ​ 2.4 裁剪netCDF文件 …...

2023建筑设计师们有哪些好用的AI设计工具?

目前&#xff0c;建筑师要么单独工作&#xff0c;要么团队合作来完成设计过程&#xff0c;这可能需要数月甚至数年的时间。设计和准备用于开发的建筑物可能需要很长时间&#xff0c;有时甚至数年。一些比较繁琐的步骤可以自动化&#xff0c;但整个过程仍然需要大量的人工和时间…...

mysql主从复制与读写分离

mysql主从复制与读写分离 MySQL主从复制是一种常见的数据复制技术&#xff0c;用于将一个MySQL数据库服务器的数据复制到其他服务器上。 单台mysql在安全性&#xff0c;高并发方面都无法满足实际需求 配置多台主从数据库服务器以实现读写分离 读写分离&#xff0c;主数据库的…...

技术控,看这里,一款支持断点调试的数据科学工具

数据科学是一门利用统计学、机器学习、数据挖掘、数据可视化等技术和方法&#xff0c;从数据中提取知识和信息的交叉学科。自上世纪60年代&#xff0c;统计学家John W.Tukey首次提出“数据分析”&#xff08;Data Analysis&#xff09;的概念起&#xff0c;数据科学已历经了几十…...

论文导读 | 大语言模型上的精调策略

随着预训练语言模型规模的快速增长&#xff0c;在下游任务上精调模型的成本也随之快速增加。这种成本主要体现在两方面上&#xff1a;一&#xff0c;计算开销。以大语言模型作为基座&#xff0c;精调的显存占用和时间成本都成倍增加。随着模型规模扩大到10B以上&#xff0c;几乎…...

进阶自动化测试,这3点你一定要知道的...

自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或系统&#xff0c;预设条件包括正常和异常&#xff0c;最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。 自动化测试框架一般可以分为两个层次&#xff0c;上层是管理整个自动化测试的开发&a…...

网络编程套接字API

一. linux平台 1.创建套接字 成功返回文件描述符&#xff0c;失败返回-1 int socket (int __domain, int __type, int __protocol) ;2.套接字绑定IP地址和端口号 成功返回0&#xff0c;失败返回-1 int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);3.开启…...

数字藏品的价值和意义

2022年以来&#xff0c;数字藏品概念在国内火热起来。从年初的《关于防范 NFT相关金融风险的倡议》到8月份央行数字货币 DCEP的正式面世&#xff0c;从中国香港首个“NFT”艺术品在香港拍卖市场成交到国内多家互联网大厂推出数字藏品平台&#xff0c;越来越多的企业开始试水数字…...

Unity物理系统脚本编程(上)

一、获取刚体组件Rigidbody 当一个物体挂载了刚体时&#xff0c;即可在脚本中获取该物体的刚体组件&#xff0c;代码如下 Rigidbody rigid; void Start() { rigidGetComponent<Rigidbody>(); } 一般将刚体变量命名为rigid并定义为一个字段&#xff0c;方便复用. 二、施…...