Java学习Day25:基础篇15:反射

news2024/10/22 17:21:30

Java 反射(Reflection)

1.前置反应

是 Java 编程语言的一个强大特性,它允许程序在运行时检查或修改类的行为。这包括获取类的信息(如字段、方法、构造函数等),以及动态地创建对象、调用方法、访问和修改字段等。

下面将介绍 Java 反射的主要知识点,并给出相应的代码示例。

1. 获取 Class 对象

  • 通过对象实例Class<?> clazz = obj.getClass();
  • 通过类字面量Class<?> clazz = MyClass.class;
  • 通过 Class.forName()Class<?> clazz = Class.forName("com.example.MyClass");

2. 访问字段

  • 获取字段Field field = clazz.getDeclaredField("fieldName");
  • 设置访问权限field.setAccessible(true);
  • 获取和设置字段值field.get(obj); 和 field.set(obj, value);

3. 访问方法

  • 获取方法Method method = clazz.getDeclaredMethod("methodName", parameterTypes);
  • 设置访问权限method.setAccessible(true);
  • 调用方法method.invoke(obj, args);

4. 访问构造函数

  • 获取构造函数Constructor<?> constructor = clazz.getDeclaredConstructor(parameterTypes);
  • 设置访问权限constructor.setAccessible(true);
  • 创建对象Object instance = constructor.newInstance(args);

注意事项

  • 反射会绕过 Java 编译器的类型检查,因此使用反射时要特别小心,以避免运行时错误。
  • 反射操作通常比直接代码调用要慢,因为它涉及到类型检查、安全检查等额外步骤。
  • 过度使用反射可能会使代码难以理解和维护。

2.小案例:

package rel;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
public class reflection {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
        Properties properties=new Properties();
        FileInputStream fileInputStream=new FileInputStream("D:\\a\\rel.txt");
        properties.load(fileInputStream);
        String className =properties.get("className").toString();
        String methodName=properties.get("methodName").toString();
        String age = properties.get("age").toString();
        Class classperson = Class.forName(className);
        //返回Person类的运行时对象classperson,也是一个类
        Constructor con =classperson.getConstructor(int.class,String.class);
        //调用构造方法,用来生成之后要用的person实例
        Object personn=con.newInstance(22,"Tom");
        System.out.println(classperson);
        Method method =classperson.getDeclaredMethod(methodName,null);
        //创建method5的运行时方法实例
        method.setAccessible(true);
        System.out.println(method);
        method.invoke(personn);
        //以前是person.方法,现在是方法invoke(实例)
    }
}

3.反射机制

1.在代码编译阶段,字节码文件在JVM中是通过类加载器被加载到方法区中。

2.方法区存储了类的结构信息、常量、静态变量以及编译后的代码等数据,为JVM执行Java程序提供了必要的支持。

3.当类被加载到JVM中时,其结构信息(如方法定义和常量)主要存储在方法区中,而类的实例(对象)则在堆上分配。栈用于存储与类实例相关的方法调用和局部变量。这些区域共同协作,以支持Java程序的运行。

4.反射优缺点

反射调用优化提速,关闭访问检测:

5.class类

不同阶段获取class对象的方式;

javac生成字节码文件后通过类加载器把字节码加载到内存中生成class对象,并在方法区中得到了类的字节码的二进制数据。

1.通常用于使用全路径对配置文件进行读取,框架多用

2.3.4.

6.哪些类型有class对象

7.类加载

普通的类是new出来静态加载,有错直接报,使用反射加载类是动态加载,只有运行到时才报错

Important图

加载(前两个阶段jvm控制)

链接:

验证

对文件安全性包括但不限于文件描述符,字节码文件等进行校验

准备

对静态变量进行默认初始化,并分配空间

0,null之类

解析

将符号引用转换为直接引用

初始化(最后一个阶段,程序员控制)

加载类时有同步锁,保证某个类在内存中只有一份class对象。

7.常用API

8.通过反射创建对象

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

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

相关文章

linux的学习第二天

1.vmware的功能&#xff1a; 快照 创建快照&#xff1a; 拍摄此虚拟机的快照&#xff1a;记录保存虚拟机的当前状态&#xff0c;如果系统出现故障&#xff0c;可以通过快照还原&#xff08;错删系统时可以找到快照的系统状态&#xff0c;然后恢复系统&#xff09; 恢复快照…

java项目之精品在线试题库系统设计与实现源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的精品在线试题库系统设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 精品在线试…

sentinel dashboard分布式改造落地设计实现解释(二)-分布式discovery组件

discovery discovery负责维护app/机器资料库&#xff0c;transport健康检测&#xff0c; transport上下线处理。discovery关键是分布式存储&#xff0c;后续研究一下raft&#xff0c;其复制&#xff0c;状态机&#xff0c;快照技术&#xff0c;但个人觉得&#xff0c;discover…

软件分享 | 截图工具 Snipaste

今天分享&#xff1a; 今日分享的是一款截图界的神器——Snipaste&#xff01; 特点&#xff1a; &#x1f3a8; 超清截图&#xff1a; Snipaste的截图功能&#xff0c;清晰度超乎你的想象。无论是工作文档还是游戏画面&#xff0c;都能一键捕捉&#xff0c;细节尽在掌握。 …

Excel:将一列拆分成多列

实现的效果是&#xff1a; 操作步骤如下&#xff1a; 1.选中列 → 点击菜单栏中的"数据" → 分列 2.选择"分列符号"&#xff0c;点击下一步 3.我想要按照空格分列&#xff0c;就选择空格 4.点击完成&#xff0c;就可以实现分列的效果了

uniapp学习(004-2 组件 Part.2生命周期)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第31p-第p35的内容 文章目录 组件生命周期我们主要使用的三种生命周期setup(创建组件时执行)不可以操作dom节点…

Shell编程-if判断

作者介绍&#xff1a;简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们前面学习了那么多命令&#xff0c;以及涉及到部分逻辑判断的问题。从简单来说&#xff0c;他就是Shell编…

【XYFrame unity框架使用文档】封装unity小框架工具集 —— XYFrame

文章目录 XYFrame介绍优点获取框架源码引入的第三方插件作者信息技术交流群反馈企鹅裙画饼使用文档导入文件目录启动1、单例模式不继承MonoBehaviour的单例模式基类继承MonoBehaviour的单例模式基类 2、Mono管理器3、事件管理系统4、工具类封装unity协程工具&#xff0c;避免 G…

每周心赏|必备AI神器第二弹

大家的假期都是怎么度过的&#xff1f;是已经玩嗨了&#xff1f;还是在家葛优躺&#xff0c;感叹时间飞逝呢&#xff1f; 别急&#xff0c;假期还没完全说拜拜呢&#xff01;赶紧抓住假期最后的尾巴&#xff0c;和AI神器一起&#xff0c;把快乐放大&#xff0c;不留遗憾&#x…

prompt learning

prompt learning 对于CLIP&#xff08;如上图所示&#xff09;而言&#xff0c;对其prompt构造的更改就是在zero shot应用到下游任务的时候对其输入的label text进行一定的更改&#xff0c;比如将“A photo of a{obj}”改为“[V1][V2]…[Vn][Class]”这样可学习的V1-Vn的token…

Docker配置网站环境

Mysql 先安装mysql 启动并后台运行&#xff1a;run -d 容器名称&#xff1a;--name 设置端口映射&#xff1a;-p 主机端口&#xff1a;容器端口 环境变量&#xff1a;-e 最后指定镜像名称 sudo docker run -d \--name mysql\-p 3306:3306\-e MYSQL_ROOT_PASSWORD123456\…

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.0 SP1升级到SP3操作方法(x64)

1、首先安装时候选择升级SQLEXPRADV_x64_CHS.exe。 2、接着安装SQLServer2008R2SP1-KB2528583-x64-sp1补丁后10.50.2500.0。 3、接着安装升级SQLEXPRWT_x64_CHS.exe。 4、继续安装SP3&#xff1a;SQLServer2008R2SP3-KB2979597-x64-CHS。 5、最后安装SP3补丁&#xff1a;SQ…

ARM64使能kdump

摘要 需要使用的工具或者配置如下: 使用kdump-defconfig编译后的kdump内核 : https://download.csdn.net/download/weixin_43412488/89886775https://download.csdn.net/download/weixin_43412488/89886775 引导kdump内核加载的ramdisk: https://download.csdn.net/dow…

【通知】红帽认证:RHCE免费补考福利来袭!

现有2024年第四季度红帽RHCE培训补考政策的通知&#xff1a; 为促进红帽第四季度(10月~12月)RHCE的招生及交付&#xff0c;红帽推出免费补考政策如下&#xff1a; 在此期间参加RHCE(EX200/EX294)考试&#xff0c;且考试订单在有效期内&#xff0c;考试如有未能通过的科目&…

移动技术开发:备忘录

1 实验名称 备忘录 2 实验目的 掌握SQLite数据库的基本操作&#xff0c;实现备忘录基本功能。 3 实验源代码 布局文件代码&#xff1a; &#xff08;1&#xff09;activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout …

在IMX6ul中,使用GPT定时器实现高精度延时

在上一节讲解过了。IMX6UL中的EPIT定时器&#xff0c;这一节我们讲解通用寄存器 在STM32中&#xff0c;我们使用过SYSTICK来实现高精度的延时。IMX6U当中没有SYSTICK定时器&#xff0c;但是IMX6U有其他的定时器&#xff0c;前面的EPIT以及这一节我们将要使用的GPT定时器…

算法备案必须做吗?不做有什么风险?

算法备案是一种强制性备案制度&#xff0c;旨在保障算法技术的合法性和合规性。 《互联网信息服务算法推荐管理规定》第二十四条明确规定应当在10个工作日内备案&#xff0c;发生变更的在10个工作日内完成变更&#xff0c;注销的在20个工作日内完成注销。 ​未履行备案的&…

共筑华芯|首届“SEMiBAY湾芯展”龙华区科技创新局助力华芯邦科技携第四代半导体芯星亮相湾区半导体产业生态博览会,诚邀您莅临参观指导

在深圳市政府指导和深圳市发展改革委支持下&#xff0c;深圳市半导体与集成电路产业联盟携手深圳市重大产业投资集团有限公司共同主办的首届“SEMiBAY湾芯展”——湾区半导体产业生态博览会&#xff0c;将于今年10月16日至18日盛大举行。 本次展会以“芯动未来&#xff0c;共创…

MYSQL8.0.24数据库登录时 报错 ERROR 1045 (28000) / MYSQL8.0.24数据库多次修改密码无效

文章目录 前提:失败方案一:修改密码失败方案二:失败方案三:最终解决方案:前提: 在没有使用电脑上的mysql一段时间之后,忘记了mysql的root账号密码。然后登录怎么登录都登录不上,在重置了密码之后。发现一直报这个错误 ERROR 1045 (28000) : Access denied for user ‘…

ChatTTS在Windows电脑的本地部署与远程生成音频详细实战指南

文章目录 前言1. 下载运行ChatTTS模型2. 安装Cpolar工具3. 实现公网访问4. 配置ChatTTS固定公网地址 前言 本篇文章主要介绍如何快速地在Windows系统电脑中本地部署ChatTTS开源文本转语音项目&#xff0c;并且我们还可以结合Cpolar内网穿透工具创建公网地址&#xff0c;随时随…