【Java基础知识总结 | 第六篇】Java反射知识总结

在这里插入图片描述

文章目录

  • 6.Java反射知识总结
    • 6.1概述
      • 6.1.1什么是反射?
      • 6.1.2为什么使用反射?
    • 6.2反射的原理
    • 6.3反射的使用
      • 6.3.1获取类对象
        • (1)通过具体类的类名获取
        • (2)通过对象实例获取
        • (3)通过class.forName(类的全路径)获取
        • (4)通过类加载器 xxxClassLoader.loadClass(类的全路径)
      • 6.3.2获取类对象的构造函数
      • 6.3.3获取类对象的方法
      • 6.3.4获取类对象的属性
    • 6.4反射的优缺点

6.Java反射知识总结

6.1概述

6.1.1什么是反射?

  1. Java反射机制指的是在Java程序 运行状态 中,对于任何一个类,都可以获得这个类的 所有属性和方法
  2. 对于给定的一个对象,都能够调用它的任意一个属性和方法。

6.1.2为什么使用反射?

在Java编程语言中,反射是一种强有力的工具,是 面向抽象编程的一种实现方式,它能使代码语句更加灵活,极大提高代码的运行时装配能力。Java反射机制允许编程人员在对类未知的情况下,获取类相关信息的方式变得更加多样灵活,调用类中相应方法,是Java加其灵活性与动态性 的一种机制。

总结一下,Java反射机制有如下作用

  1. 反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力;
  2. 通过反射机制可以让程序创建和控制任何类的对象,无需提前硬编码目标类;
  3. 使用反射机制能够在运行时构造一个类的对象、判断一个类所具有的成员变量和方法、调用一个对象的方法;
  4. 反射机制是构建框架技术的基础所在,使用反射可以避免将代码写死在框架中。

6.2反射的原理

  1. 首先我们需要了解Java程序运行的过程,该过程包含两个阶段:编译运行
  2. 在程序编译阶段,Java代码会通过JDK编译成 .class字节码文件;
  3. 在程序运行阶段,JVM会去调用业务逻辑对应需要的的字节码文件,生成对应的Class对象,并调用其中的属性方法完成业务逻辑。
  4. Java的反射机制原理:在程序运行阶段,主动让JVM去加载某个 .class文件生成Class对象,并调用其中的方法和属性。 如下图:

Java类加载过程

6.3反射的使用

  • 四个常用的类
类名作用
Class类类的实体,在运行的Java应用程序中表示类和接口
Field类类的成员变量(成员变量也称为类的属性)
Method类类的方法
Constructor类类的构造方法

6.3.1获取类对象

(1)通过具体类的类名获取
Class bookClass = Book.class;
		
//输出类名
System.out.println(bookClass.getName());
(2)通过对象实例获取
Book book = new Book();
Class bookClass = book.getClass();
		
//输出类名
System.out.println(bookClass.getName());
(3)通过class.forName(类的全路径)获取
Class bookClass;
try {
	bookClass = Class.forName("test.Book");
	//输出类名
	System.out.println(bookClass.getName());
} catch (ClassNotFoundException e) {
	e.printStackTrace();
}
(4)通过类加载器 xxxClassLoader.loadClass(类的全路径)
ClassLoader.getSystemClassLoader().loadClass("cn.javaguide.TargetObject");

6.3.2获取类对象的构造函数

  • 当获取到一个类的Class对象之后,可以调用Class对象的==getDeclaredConstructors()==方法获取该类的构造函数,如下:
	// 反射所有声明的构造方法
	public static void reflectAllConstructor() {
		System.out.println(TAG + "=============获取所有的声明的构造函数==============");
		try {
			Class<?> classBook = Class.forName("test.Book");
			Constructor<?>[] constructorsBook = classBook
					.getDeclaredConstructors();
			for (Constructor constructor : constructorsBook) {
				System.out.println(TAG + constructor);
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
  • 获取了构造函数之后,调用Constructor类对象的newInstance()即可构造出我们想要类的对象,如下:
Book book = (Book)constructor.newInstance();

6.3.3获取类对象的方法

  • 当我们得到了一个Class对象之后,我们可以获取该类的所有方法,如下:
  • getDeclaredMethods()和getMethods()都可以获取到类的方法,辨别?
    • getMethods()获取了自己定义的公用方法(private获取不了),还把Object父类的公用方法也获取了
    • getDeclaredMethods()只能获取自己类中定义的方法,但是可以获取到private方法
    // 反射所有的public的函数
	public static void reflectPublicMethods() {
		System.out.println(TAG + "=============获取所有的public的函数==============");
		try {
			Class<?> classBook = Class.forName("test.Book");
			Method[] methodsBook = classBook.getMethods();
			for (Method method : methodsBook) {
				System.out.println(TAG + method);
			}

		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	// 反射所有的声明的方法
	public static void reflectAllMethods() {
		System.out.println(TAG + "=============获取所有的声明的函数==============");
		try {
			Class<?> classBook = Class.forName("test.Book");
			Method[] methodsBook = classBook.getDeclaredMethods();
			for (Method method : methodsBook) {
				System.out.println(TAG + method);
			}

		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

6.3.4获取类对象的属性

当我们得到了一个Class对象之后,我们可以获取该类的所有属性,代码如下:

同Methods,获取属性也有getDeclaredFields()和getFields()两种。

	// 反射所有的public的属性
	public static void reflectPublicFields() {
		System.out.println(TAG + "=============获取所有的public的属性==============");
		try {
			Class<?> classBook = Class.forName("test.Book");
			Field[] fieldsBook = classBook.getFields();
			for (Field field : fieldsBook) {
				System.out.println(TAG + field);
			}

		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	// 反射所有的声明的属性
	public static void reflectAllFields() {
		System.out.println(TAG + "=============获取所有的声明的属性==============");
		try {
			Class<?> classBook = Class.forName("test.Book");
			Field[] fieldsBook = classBook.getDeclaredFields();
			for (Field field : fieldsBook) {
				System.out.println(TAG + field);
			}

		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

6.4反射的优缺点

  • 优点:让咱们的代码更加灵活、为各种框架提供开箱即用的功能提供了便利
  • 缺点:
    • 同样也增加了安全问题。比如可以无视泛型参数的安全检查(泛型参数的安全检查发生在编译时)。
    • 另外,反射的性能也要稍差点,不过,对于框架来说实际是影响不大的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

正式发布:VitePress 1.0 现代化静态站点生成器!

大家好&#xff0c;我是奇兵&#xff0c;今天介绍一下现代化静态站点生成器!&#xff0c;希望能帮到大家。 3 月 21 日&#xff0c; 由 Vue 团队出品的现代化静态站点生成器 VitePress 正式发布 1.0 版本&#xff01;它专为构建快速、以内容为中心的网站而生&#xff0c;能够轻…

Django之Celery篇(一)

一、介绍 Celery是由Python开发、简单、灵活、可靠的分布式任务队列,是一个处理异步任务的框架,其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务。 Celery侧重于实时操作,但对调度支持也很好,其每天可以处理数以百万计的任务。特点: 简单:熟悉…

获取Book里所有sheet的名字,且带上超链接

应用背景&#xff1a; 当一个excel有很多sheet的时候&#xff0c;来回切换sheet会比较复杂&#xff0c;所以我希望excel的第一页有目录&#xff0c;可以随着sheet的增加&#xff0c;减少&#xff0c;改名而随时可以去更新&#xff0c;还希望有超链接可以直接跳到该sheet。 可以…

VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准

文章目录 VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准总结摘要介绍相关工作单视角指静脉识别多视角指静脉识别Transformer 数据库基本信息 方法总体结构静脉掩膜生成VPC编码器视角内相关性的提取视角间相关关系提取输出融合IFFN近邻感知模块(NPM) patch嵌…

ssm006基于java的少儿编程网上报名系统+vue

少儿编程网上报名系统 摘 要 在国家重视教育影响下&#xff0c;教育部门的密确配合下&#xff0c;对教育进行改革、多样性、质量等等的要求&#xff0c;使教育系统的管理和运营比过去十年前更加理性化。依照这一现实为基础&#xff0c;设计一个快捷而又方便的网上少儿编程网上…

pdf压缩文件怎么压缩最小?一键压缩PDF

pdf文件压缩是为了减小文件大小&#xff0c;以便更轻松地共享、传输和存储文件&#xff0c;通过压缩pdf文件&#xff0c;可以减少文件占用的存储空间&#xff0c;加快文件的上传和下载速度&#xff0c;并节省带宽和存储成本;在本教程中&#xff0c;我们将介绍一些有效的方法来最…

如何自定义一个starter?

在Spring Boot中&#xff0c;创建一个自定义starter可以简化特定功能或组件的配置过程&#xff0c;让其他项目能够轻松地重用这些功能。 一、问题解析 这里我们以自定义一个xxl-job的starter为例&#xff0c;介绍下如何简化配置。 添加依赖 添加Spring Boot的依赖&#xff1a…

关于网格数据导出指定格式的测试(以Gmsh导出nas格式为例)

本文主要讲述Gmsh如何导出nas格式的网格数据&#xff0c;众所周知&#xff0c;Gmsh可以导出多种网格数据格式&#xff0c;比如大家熟悉的msh、stl、inp、cgns&#xff08;似乎不完善&#xff09;等等&#xff0c;但是gmsh不支持nas格式的导出&#xff0c;只支持nas格式的导入&a…

Bug定位与分析,软件测试员你中招了吗?

之所以写这一篇文章&#xff0c;是突然想起来曾经在测试过程中被开发嘲讽过&#xff0c;事情是这样的&#xff0c;当时发现了一个疑似前端的Bug就草草提交到了禅道&#xff0c;结果刚来的女前端看到了就有点生气地问我为啥不查清到底是前后端问题就直接派给她前端了&#xff0c…

睿考网:不是会计专业能考中级会计师吗?

不是会计专业也是可以考中级会计师的&#xff0c;中级会计师报名条件中并没有对专业做明确的限制&#xff0c;不同的学历对工作年限的要求不一样&#xff0c;如果考生满足报考条件就可以参加。 1.具备大学专科学历&#xff0c;从事会计工作满5年。 2.具备大学本科学历或学士学…

大数据Doris(七十):全球电商狂欢节万亿级实时大屏解决方案

文章目录 全球电商狂欢节万亿级实时大屏解决方案 一、背景介绍 <

学习vue3第十一节(依赖注入:provide/inject)

本机介绍&#xff1a;provide/inject 注意&#xff1a;大家在看此小节时候&#xff0c;默认大家已经了解一些组件的使用方法 1、依赖注入的用途&#xff1a; 当嵌套层级多的时候&#xff0c;某个子组件需要较远层级的父组件数据时候&#xff0c;如果我们依然使用props 传递数…

算法学习 | day25/60 递增子序列/全排列/全排列II

一、题目打卡 1.1 递增子序列 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> path;vector<vector<int>> res;int tmp INT_MIN;void recur(vector<int>& nums, int startInd){if(p…

Java项目:74 ssm基于Java的超市管理系统+jsp

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 功能包括:商品分类&#xff0c;供货商管理&#xff0c;库存管理&#xff0c;销售统计&#xff0c;用户及角色管理&#xff0c;等等功能。项目采…

数据库性能压测之TPC-C基准测试

原文链接&#xff1a;https://blog.csdn.net/TIME_1981/article/details/126114797 本文作为学习笔记记录。 TPC Transaction Processing Performance Council (TPC) 事务处理性能委员会&#xff0c;是一家非盈利IT组织&#xff0c;他们的目的是定义数据库基准并且向产业界推…

力扣438. 找到字符串中所有字母异位词

Problem: 438. 找到字符串中所有字母异位词 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.编写辅助函数bool same(vector& need, vector& matched)&#xff1a; 1.1 以need为标准&#xff0c;循环对比need和matched的每一个位置的元素值是否相等 2.获…

NAT---网络地址转换技术

Network Address Translation 1、起源&#xff1a;ip地址不够用 2、作用&#xff1a;让私网地址映射成公网地址&#xff0c;进而访问网络。 3、私网Ip地址的范围&#xff1a; A类&#xff1a;10.0.0.0-10.255.255.255 B类&#xff1a;172.16.0.0-172.31.255.255 C类&…

多线程合并练习题,线程安全(售票任务引入)--学习JavaEE的day30

day30 练习&#xff08;day29&#xff09; 注意代码注释&#xff0c;里面涉及代码实现遇到问题及解决方案&#xff0c;由于理解方便没有单独出来 1.计算任务 1.计算任务&#xff0c;一个包含了2万个整数的数组&#xff0c;分拆了多个线程来进行并行计算&#xff0c;最后汇总出…

Open CASCADE 用户指南:可视化

文章目录 介绍基本概念呈现(Presentation)Presentation 的结构Presentation 包(package)基本示例&#xff1a;如何显示 3D 对象 选择(Selection)术语和概念算法包和类(Packages and classes)使用示例 应用交互服务&#xff08;AIS&#xff09;介绍交互对象呈现(Presentations)隐…