Java反射简单介绍_01

news2024/12/25 0:04:08

文章目录

        • 1. 什么是反射
        • 2. Java中类加载的三个阶段
        • 3. 反射机制提供的相关类
        • 4. Java中获取Class类的三种方式
        • 5. Class类提供的功能
            • 5.1. 获取Field类方法
            • 5.2. 获取Method类方法
            • 5.3. 获取Constructor类方法
            • 5.4. Class中其他方法

1. 什么是反射

Java中的反射主要是体现在运行期间,让程序在运行期间可以动态获取Java中的类,属性,方法,构造方法,以及注解等功能,以及可以在运行期间动态的设置或调用属性,方法,构造方法,注解等功能,总结来说反射机制就是可以在运行期间动态的获取对象的所有信息并且更改执行的代码。
Java的反射是在运行期间操作的功能,这种功能被称为Java反射机制
编程语言一般分为两种:1. 弱类型语言,2. 强类型语言

  1. 弱类型语言:
    1. 弱类型语言是指定义变量时的类型可以动态修改,变量没有固定的数据类型,一个变量可以赋值任意数据类型(JDK11后Java也支持弱类型)
  2. 强类型语言:
    1. 强类型语言是指定义变量时的类型已被确认,无法修改类型,类型不会因为数据赋值而改变(JDK1.8就是强类型语言)
    2. Java的反射机制早起出现就是为了弥补强类型语言中的数据类型固定的问题,以及Java底层运行方式

Java运行的步骤也是反射机制的体现:通过编译器将.java文件编译成.class字节码文件,再通过JVM.class字节码文件加载进内存在堆中生成对应的Class对象,JVM在加载.class文件时就是使用的反射机制.

2. Java中类加载的三个阶段

Java中类加载分为三个阶段:1. 源代码,2. 类加载,3. 运行时

  1. 源代码(source)
    1. 源代码是指编译后的.class文件,经过编译后的.class字节码文件就是源代码
  2. 类加载(class)
    1. 类加载是将.class文件通过类加载器加载到虚拟机中运行,类加载器解析.class文件生成的Class对象
  3. 运行时(runtime)
    1. 当运行期间调用它newInstance()方法时会根据Java的类型生成对应的对象,并开始执行代码
      在这里插入图片描述

3. 反射机制提供的相关类

java提供的与反射有关的类都在java.lang.reflect包中
在这里插入图片描述
反射机制提供的相关类是用于在运行期间动态的获取或设置内容,提供了类,属性,方法,构造方法等功能

  1. Class:获取当前对象的类(当前类的全限定名称–>从包名到类名的全名称)
    1. Class类功能是可通过Class类创建对象的实例,并且类中的Constructor,Method,Field这些类都是通过Class类获取
  2. Constructor:获取当前类中的构造方法(可以获取包括private修饰的)
    1. 用于获取构造方法后调用构造方法创建对象实例
  3. Method:获取当前类中的方法(可以获取包括private修饰的)
    1. 用于获取方法后调用此方法
  4. Field:获取当前类中的属性(可以获取包括private修饰的)
    1. 用于获取属性后设置或获取属性的数据
      在这里插入图片描述

4. Java中获取Class类的三种方式

Java中提供了三种方式获取Class类:

  1. 创建对象并调用Object提供的getClass方法获取
  2. 通过类名.class获取–>一般用于方法参数使用
  3. 通过Class类的静态方法 Class.forName("类的全限定名称"):获取–>可用于动态创建或加载对象使用
         public static void main(String[] args) throws ClassNotFoundException {
        // 1. 创建对象并调用Object类的getClass方法
        Demo demo = new Demo();
        Class<? extends Demo> clazz1 = demo.getClass();
        System.out.println("getClass = " + clazz1);
        // 2. 通过类名.class获取Class类
        Class<Demo> clazz2 = Demo.class;
        System.out.println("class = " + clazz2);
        // 3. 通过Class.forName("全限定名称")获取Class对象
        Class<?> clazz3 = Class.forName("reflection.Demo");
        System.out.println(".forName = " + clazz3);
    }
    

5. Class类提供的功能

通过Class类key获取Field,Method,Constructor对象,通过这些对象可以调用或设置获取类中的数据

5.1. 获取Field类方法
  1. public Field getDeclaredField(String name):通过属性名称获取指定属性,可以获取所有修饰符修饰的属性
  2. public Field[] getDeclaredFields():获取类中所有的属性,可以获取所有修饰符修饰的属性
		// 通过Class.forName获取Class类
        Class<?> clazz = Class.forName("reflection.User");
        Field id = clazz.getDeclaredField("id");
        System.out.println("id = " + id);
        System.out.println("==================================");
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println("declaredField = " + declaredField);
        }
5.2. 获取Method类方法
  1. public Method getDeclaredMethod(String name, Class<?>... parameterTypes):通过方法名称以及形参列表类型获取指定方法,可以获取除父类之外的所有修饰符修饰的方法
  2. public Method[] getDeclaredMethods():获取类中的所有方法,可以获取除父类之外的所有修饰符修饰的方法
      // 通过Class.forName获取Class类
        Class<?> clazz = Class.forName("reflection.User");
        Method method1 = clazz.getDeclaredMethod("method", Integer.class);
        System.out.println("method1 = " + method1);
        System.out.println("===================================");
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println("declaredMethod = " + declaredMethod);
        }
5.3. 获取Constructor类方法
  1. public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes):通过指定形参列表类型获取指定构造方法,可以获取所有修饰符修饰的构造方法
  2. public Constructor<?>[] getDeclaredConstructors():获取类中所有的构造方法,可以获取所有修饰符修饰的构造方法
   // 通过Class.forName获取Class类
        Class<?> clazz = Class.forName("reflection.User");
        Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(Integer.class);
        System.out.println("declaredConstructor = " + declaredConstructor);
        System.out.println("=================================");
        Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor1 : declaredConstructors) {
            System.out.println("declaredConstructor1 = " + declaredConstructor1);
        }
5.4. Class中其他方法
  1. public String getName():获取当前类的名称
  2. public String getSimpleName():获取当前类简单名称
  3. public String getTypeName():获取类型名称
  4. public native int getModifiers():获取修饰符,返回int类型,值为Modifier类中的16进制属性
  5. public InputStream getResourceAsStream(String name):获取类路径下的(resources目录)资源数据,会将数据存储到内存,多次读取数据是相同的
  6. public T newInstance():返回当前类的实例对象

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

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

相关文章

uniapp 用css画五边形(app 小程序)

效果图 css .scoreLabel{ background: $yxs-theme-color; width: 64rpx; height: 69rpx; line-height: 32rpx; font-size: 28rpx; font-family: DINPro; f…

点亮未来明灯,引领绿色革命

随着全球气候变化日趋严重&#xff0c;能源转型成为解决气候问题和提高全球能源安全合理性的必要措施之一。可持续能源技术因其对环境的友好性和可再生性而成为了当前热点话题。可持续能源技术已经成为人们日益关注的焦点。这项技术可以帮助我们减少对化石燃料的依赖&#xff0…

如何选择适合自己的小程序开发框架

随着微信、支付宝等开放平台的壮大&#xff0c;移动应用生态市场的蓬勃发展&#xff0c;例如小程序已经成为各个企业和开发者的重要选择。为了提高小程序的开发效率和代码重用性&#xff0c;许多第三方开发框架应运而生。 准备为需要的朋友整理一些常见的小程序第三方开发框架…

能伸展脖子的机器人?东京大学最新研究成果:基于鸵鸟肌肉骨骼结构和行为,具有高度灵活性的新型机械臂—RobOstrich(附论文)

原创 | 文 BFT机器人 得益于高度灵活的颈部&#xff0c;鸟类可以做很多事情&#xff0c;无论是转过头梳理自己的后背&#xff0c;在飞行过程中“眼观六路”&#xff0c;还是在地面或树上难以触及的角落和缝隙寻找食物。而在所有鸟类中&#xff0c;鸵鸟以其结实灵巧的颈部脱颖而…

顶部菜单栏-popuwindows

效果 布局文件 猜想与步骤 1.通过.9.png 制作尖尖效果&#xff0c; 2.popuwindows弹出布局框 以及灰色背景 3.点击按钮进入不同功能

QT运行程序后出现无法打开输出文件问题

:-1: error: cannot open output file release\Dailin.exe: Permission denied collect2.exe:-1: error: error: ld returned 1 exit status 如上所示报错。这个是因为用户写的程序开辟空间后没有释放造成的。用户需要把开辟了空间释放就可以了。 我的例子如下。 My_Uart *Ua…

【聚焦】“饶派杯”XCTF车联网安全挑战赛即将开启!

为深入贯彻落实国家网络强国和交通强国战略部署&#xff0c;推动智能网联汽车技术与产业发展、加快该领域人才培养、提升行业创新&#xff0c;打造自主可控、自主研发的中国智能网联汽车安全生态体系&#xff0c;由江西省委网信办、江西省工信厅、上饶市人民政府主办&#xff0…

【云渲染案例】《长月烬明》特效出圈?国内9家视效公司联手打造国风新仙侠!丨瑞云渲染案例

仙侠剧是中国电视剧的一大特色&#xff0c;也是很多观众喜爱的类型。近年来&#xff0c;仙侠剧的制作水平越来越高&#xff0c;由鞠觉亮执导&#xff0c;罗云熙、白鹿领衔主演的《长月烬明》就是一部在今年四月份引起了轰动的虐恋仙侠剧&#xff0c;它以炫丽的特效、新颖的剧情…

目前流行的9大前端框架

1. React 2. Vue 3. Angular 、 4. Svelte 官网&#xff1a;https://svelte.dev 中文官网&#xff1a;https://www.sveltejs.cn Svelte 是一种全新的构建用户界面的方法。传统框架如 React 和 Vue 在浏览器中需要做大量的工作&#xff0c;而 Svelte 将这些工作放到构建应用程…

WLAN,AP等

无线网络部署方案&#xff1a; AC直连式组网 AC旁挂式组网 WLAN 是无线局域网&#xff08;Vireless Local Area Network&#xff09;的简称 也称之为 Wi-Fi 简单理解&#xff1a;无线就是网线的一个延长 AC&#xff1a;无线控制器--统一管理AP AP&#xff1a;散发无线…

nginx 服务器总结

一. 负载均衡的作用有哪些&#xff1f; 1、转发功能 按照一定的算法【权重、轮询】&#xff0c;将客户端请求转发到不同应用服务器上&#xff0c;减轻单个服务器压力&#xff0c;提高 系统并发量。 2、故障移除 通过心跳检测的方式&#xff0c;判断应用服务器当前是否可以正常…

原神个人服务器替换模型(3Dmigoto)教程

原神个人服务器替换模型(3Dmigoto)教程 本期教程教大家如何修改原神私服角色模型 首先下载3Dmigoto &#xff08;3Dmigoto是开源的自己有兴趣想法的在GIT搜&#xff09; 打开3Dmigoto文件内的d3dx.ini文件 找到target &#xff08;我们需要找到有路径的这个选项&#xff09; …

【Vue基础】Element案例学习-智能学习辅助系统

一、效果展示 初步设计一个系统&#xff0c;有目录、搜索栏、表格操作等。 二、参考代码 主要关注上图“App.vue”和“BtestView.vue”两个文件的代码 1、App.vue <template><div ><!-- <h1>{{ message }}</h1> --><!-- <element-view&…

吃透阿里2023版Java性能优化小册后,我让公司系统性能提升了200%

性能优化可以说是很多一线大厂对其公司内高级开发的基本要求 &#xff08;其中以Java岗最为显著&#xff09; 。其原因有两个&#xff1a;一是提高系统的性能&#xff0c;二是为公司节省资源。两者都能做到&#xff0c;那你就不可谓不是普通程序员眼中的“调优大神了”。 那么…

【LinuxShell】Shell编程之iptables防火墙

文章目录 一、iptables防火墙1.iptables防火墙概述2.netfilter和iptables 二、iptables的表、链结构1.iptables的四表五链结构介绍2.四表五链的作用3.数据包控制的匹配流程规则链之间的匹配顺序规则链内的匹配顺序 三、iptables用法1.基本语法命令格式常用的控制类型 2.添加、查…

vite3+vue3 项目打包优化二 —— 依赖分包策略

在没有配置构建工具的分包功能时&#xff0c;构建出来的文件将无比巨大且是独立的一个 js 和 css 文件&#xff08;如下图&#xff09;&#xff0c;这样本地加载文件时会存在巨大的压力。 默认情况下&#xff0c;浏览器重复请求相同名称的静态资源时&#xff0c;会直接使用缓存…

Linux-权限的理解

目录 一、Shell命令以及运行原理 二、Linux权限的概念 三、Linux权限管理 1、文件访问者的分类 2、文件类型和访问权限 3、文件权限值的表示方法 4、文件访问权限的相关设置方法 1)chmod 2)chown 3)chgrp 4)umask 5)file 5、目录的权限 6、粘滞位 7、总结 一、S…

商业银行积极践行双碳战略,浦发信用卡绿色低碳3.0全方位助力双碳经济

易观&#xff1a;“双碳”目标驱动下&#xff0c;高速增长的绿色金融需求将成为银行新增长点&#xff0c;银行机构以“绿色银行”为战略导向&#xff0c;加快绿色业务布局&#xff0c;以低碳生活主题信用卡探索绿色金融发展新模式。浦发银行聚焦绿色金融&#xff0c;以信用卡探…

pix2pix代码

看一下模型图&#xff1a; 首先定义生成器G&#xff0c;和CGAN不同的是&#xff0c;pix2pix并没有输入噪声&#xff0c;而是采用dropout来增加随即性。然后生成器输入x&#xff0c;输出y都是一些图片。最后按照原文&#xff0c;G是一个U-Net shape的&#xff0c;除了上采样和下…

openwrt的openclash提示【更新失败,请确认设备闪存空间足够后再试】

网上搜索了一下&#xff0c;问题应该是出在“无法从网络下载内核更新包”或者“无法识别内核的版本号” 解决办法&#xff1a;手动下载&#xff08;我是只搞了DEV内核就搞定了TUN和Meta没有动&#xff09; --> 上传到路由器上 --> 解压缩 --> 回到openclash界面更新配…