Java开发基础系列(八):泛型及反射

news2024/11/25 15:00:30
😊 @ 作者: 一恍过去
💖 @ 主页: https://blog.csdn.net/zhuocailing3390
🎊 @ 社区: Java技术栈交流
🎉 @ 主题: Java开发基础系列(八):泛型及反射
⏱️ @ 创作时间: 2023年07月18日

在这里插入图片描述

目录

  • 泛型
  • 反射

泛型

泛型是Java中的一个重要特性,是一种类型参数化的机制,它允许在类、接口、方法的定义和使用中指定类型参数,从而增加代码的通用性、类型安全性和可读性。它提供了在编译时期进行类型检查和类型安全的能力。通过使用泛型,可以编写更加通用和可复用的代码。

通过使用泛型,可以在定义类、接口和方法时使用类型参数,这些类型参数在使用时会被具体的类型替代。这样可以实现类、接口和方法的参数化,以适应不同类型的数据处理需求。

泛型的特点:

  • 类型安全:通过泛型,编译器可以在编译时检查类型,并提供类型安全的代码。这意味着可以在编译时捕获类型错误,避免在运行时出现类型转换错误。
  • 代码复用:泛型可以使代码更通用和可复用。通过定义泛型类、接口和方法,可以编写适用于多种类型的代码,而无需为每种类型都创建新的类或方法。
  • 可读性:使用泛型可以提高代码的可读性和可理解性。通过泛型的类型参数,可以明确指定方法或类与哪种类型相关联,从而提供更清晰的代码逻辑。

泛型的定义:

  • 泛型类:通过在类名后面使用尖括号(<>)和类型参数来定义泛型类。类型参数可以是单个字母或任意有效的标识符,表示可以在类的定义和使用中使用的类型。
    public class Test<T> {
        private T t;
    
        public void addItem(T t) {
            this.t= t;
        }
    
        public T getItem() {
            return t;
        }
    }
    
  • 泛型接口:与泛型类类似,可以在接口的名称后面使用尖括号(<>)和类型参数来定义泛型接口。
    public interface Test<T> {
        void add(T t);
    }
    
  • 泛型方法:在方法的返回类型前面使用尖括号(<>)和类型参数来定义泛型方法。
    public <T> void setArray(T[] array) {
        for (T t: array) {
            System.out.println(t);
        }
    }
    

反射

反射是Java的一项强大的特性,允许在运行时动态地获取和操作类的信息,包括类的方法、字段、构造函数等。通过反射,可以在编译时无法确定的情况下,通过运行时分析和操作类的结构。

反射在某些情况下非常有用,如动态加载类、在运行时解析和执行外部配置的类、实现框架和工具等。但是,由于反射涉及到在运行时进行动态操作,因此可能会带来一些性能上的损失。

反射的特性:

  • 获取类的信息:可以获取类的名称、包名、父类、接口、字段、方法等信息。
  • 实例化对象:可以通过类的构造函数动态地创建对象实例。
  • 调用方法和访问字段:可以通过方法名称和参数类型动态地调用方法,也可以通过字段名称访问和修改字段的值。
  • 处理注解:可以获取和解析类、方法、字段上的注解信息。

获取类的Class对象:

  • 使用类的.class属性:Class<?> clazz = MyClass.class;
  • 使用Class.forName()方法:Class<?> clazz = Class.forName("com.example.MyClass");com.example.MyClass为类实际的路径。
  • 使用对象的.getClass()方法:Class<?> clazz = myObject.getClass();

获取类的信息:
获取类信息之前需要先获取到class对象

  • 获取类的名称:String className = clazz.getName();
  • 获取类的修饰符:int modifiers = clazz.getModifiers();
  • 获取类的父类:Class<?> superClass = clazz.getSuperclass();
  • 获取类的接口:Class<?>[] interfaces = clazz.getInterfaces();
  • 获取类的共有构造函数:Constructor<?>[] constructors = clazz.getConstructors();
  • 获取类的共有方法:Method[] methods = clazz.getMethods();
  • 获取类的共有字段:Field[] fields = clazz.getFields();
  • 获取类的所有构造函数:Constructor<?>[] constructors = clazz.getDeclaredConstructors();
  • 获取类的所有方法:Method[] methods = clazz.getDeclaredMethods();
  • 获取类的所有字段:Field[] fields = clazz.getDeclaredFields();

实例化对象:
实例化对象之前需要先获取到class对象

  • 通过无参构造函数实例化:Object obj = clazz.newInstance();(在Java 9之后已过时)
  • 通过有参构造函数实例化:首先获取构造函数对象(constructors),然后使用构造函数的newInstance()方法。

调用方法和访问字段:
通过Method和Field对象调用方法和访问字段

  • 调用方法:首先获取方法对象,然后使用方法的invoke()方法调用方法。
  • 访问字段:首先获取字段对象,然后使用字段的get()和set()方法访问和修改字段的值。

在这里插入图片描述

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

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

相关文章

ETLBox for .Net Crack

ETLBox for .Net Crack 为设计的轻量级ETL(提取转换负载)工具箱和数据集成库。NET。 ETL是现代商业智能应用程序的基础&#xff0c;是将分析与之前的所有其他组件分离的唯一方法。ETL是提取-加载、转换和转换的缩写&#xff0c;描述了一个由三个步骤组成的过程&#xff1a; 提取…

学生成绩管理系统|Python小应用练习

题目要求 实现学生成绩管理系统 输入学生成绩信息序列&#xff0c;获得成绩从高到低、从低到高、按某一门成绩的排列,相同成绩都按先录入排列在前的规则处理。 数据如下&#xff1a;(数据规则&#xff1a;学生姓名 高数成绩 英语成绩 大物成绩) SanZhang 70 80 61 SiLi 86 77 …

Java的五种数据类型解析

Java的五种数据类型解析 不知道大家对java的简单数据类型是否了解&#xff0c;下面针对Java的五种类型简单数据类型表示数字和字符&#xff0c;进行详细的讲解和分析。 一、简单数据类型初始化 在Java语言中&#xff0c;简单数据类型作为类的成员变量声明时自动初始化为默认值…

IDEA远程调试SpringBoot项目

IDEA远程调试SpringBoot项目 一、前提二、脚本三、运行远程项目四、本地配置五、使用场景六、扩展点 一、前提 保证线上的jar代码和本地代码一样 二、脚本 nohup java -Xdebug -Xnoagent -Djava.compilerNONE Xrunjdwp:transportdt_socket,servery,suspendn,address5001 -ja…

golang网络编程学习-websocket

golang网络编程学习-websocket 网络编程主要的内容是&#xff1a; 1.TCP网络编程 2.http服务 3.rpc服务 4.websocket服务 一、websocket编程 1.1服务端&#xff0c;代码来自网络&#xff0c;仅限于学习研究 package mainimport ("fmt""net/http""os…

智慧签 - 开源研究系列文章

这些天整理了一下以前的代码&#xff0c;将一个插件里的便签器的源码单独找出来&#xff0c;弄成了这个“智慧签”的程序。程序比较简单&#xff0c;具体请读者自己看代码。 1、 项目目录&#xff1b; 目录见下图&#xff0c;对代码进行了划分&#xff0c;比较简单。主处…

golang网络编程学习-1rpc

网络编程主要的内容是&#xff1a; 1.TCP网络编程 2.http服务 3.rpc服务 4.websocket服务 一、rpc RPC 框架----- 远程过程调用协议RPC&#xff08;Remote Procedure Call Protocol)-----允许像调用本地服务一样调用远程服务。 RPC是指远程过程调用&#xff0c;也就是说两台服…

visual studio配置调用c++ dll opencv为例

1&#xff0c;配置VC目录&#xff0c;包含目录和库目录。 2&#xff0c;链接器->输入->包含目录 3&#xff0c;生成目录下包含对应的dll文件 4&#xff0c;需注意对应的Debug&#xff0c;Release及X86&#xff0c;X64选项

flutter 自适应宽高气泡框,聊天气泡框

先看效果 前言&#xff1a;&#xff1a;&#xff1a;&#xff1a; 网上好多气泡框&#xff0c;都让写固定宽高&#xff0c;无法自适应文本内容。 还有的就是通过算child 然后动态计算气泡框宽高&#xff0c;脱裤子&#x1f4a8;&#xff0c;放到listview 刷新数据还会丢ui&am…

Spring Cloud Alibaba的组件(解决方案)

Spring Cloud Alibaba的组件&#xff08;解决方案&#xff09; 前言Spring CloudSpring Cloud Alibaba问题的解决方案面临的问题Spring Cloud Alibaba给出的解决方案 前言 在之前的文章里我们介绍了分布式微服务以及其需要解决的问题&#xff0c;现在我们看看在Spring Cloud A…

31. IO操作

一、概览二、磁盘操作三、字节操作 实现文件复制装饰者模式 四、字符操作 编码与解码String 的编码方式Reader 与 Writer实现逐行输出文本文件的内容 五、对象操作 序列化Serializabletransient 六、网络操作 InetAddressURLSocketsDatagram 七、NIO 流与块通道与缓冲区缓冲区状…

数据结构基本概念、线性表、顺序表

一、头文件 head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXSIZE 8typedef int datatype; typedef struct {int len;datatype data[MAXSIZE]; }Seqlist;Seqlist * Request_space(voi…

利用python绘制对数坐标轴

利用python绘制对数坐标轴 1&#xff09;效果图 2&#xff09; 程序代码 import matplotlib.pyplot as plt import numpy as np# 设置图形的大小 plt.figure(figsize(8, 6))# 设置x轴的范围为10的-4次方到10的3次方 plt.xlim(1e-4, 1e3)# 绘制x轴的对数坐标轴 plt.xscale(log…

浅谈防火门监控系统在酒店防火安全中的重要应用

安科瑞 华楠 摘要&#xff1a;建筑防火问题已经引起人们的广泛关注&#xff0c;合理进行建筑消防设计成为了建筑设计的重要内容。防火门监控系统是建筑防火研究的新成果。对日常防火分区监控及发生火灾后对火势和有毒气体的控制起到关建作用。文章对防火门监控系统的组成和工…

网络安全(黑客技术)自学笔记+就业市场前景分析

一、针对网络安全市场分析 市场需求量高&#xff1b;则是发展相对成熟入门比较容易。所需要的技术水平国家政策环境 对于国家与企业的地位愈发重要&#xff0c;没有网络安全就没有国家安全 更有为国效力的正义黑客—红客联盟 可见其重视程度。 需要掌握的知识点偏多 外围打点…

18 - 堆栈 - 二项堆

前面我们学习了斐波那契堆, 今天我们来学习二项堆! 二项堆 二项堆是二项树的集合或是由一组二项树组成。 二项堆H由一组满足以下性质的二项树组成: 1) H中的每个二项树都遵循最小堆性质:节点的关键字不大于其子节点的关键字。因此,根的关键字最小 2) 对任意非负整数…

【ARM——当前程序状态寄存器 CPSR

文章目录 CPSRSPSRSPSRCPSR 各个位含义 CPSR Current Program Status Register 即 CPSR,当前程序状态寄存器&#xff0c;可以在任何处理器模式下被访问。它包含了条件标志位、中断禁止位&#xff0c;当前处理器模式标志以及其他的一些控制和状态位。 SPSR 除了 usr 和 sys 模…

【C++】list的使用及底层实现原理

本篇文章对list的使用进行了举例讲解。同时也对底层实现进行了讲解。底层的实现关键在于迭代器的实现。希望本篇文章会对你有所帮助。 文章目录 一、list的使用 1、1 list的介绍 1、2 list的使用 1、2、1 list的常规使用 1、2、2 list的sort讲解 二、list的底层实现 2、1 初构…

vue文件上传,文件打不开。文件上传 on-progress不触发

//文件上传带进度条<el-uploadv-model:file-list"fileList":limit"3":on-progress"beforeAvatarUpload"//on-progress 不触发&#xff0c;触发的关键在于覆盖原有的http请求:http-request"getFile":action"${app.api}/student…

【从零开始学习JAVA | 第二十九篇】Stream流

目录 前言&#xff1a; Stram流&#xff1a; 设计目标&#xff1a; 使用步骤&#xff1a; 1.先得到一条Stream流&#xff0c;并把数据放上去。 2.利用Stream流中的各种API进行操作。 使用Stream流的注意事项&#xff1a; 总结: 前言&#xff1a; 本文我们将学习Stream流…