【JAVA基础】什么是泛型? 什么是反射?

什么是泛型? 什么是反射?

  • 什么是泛型?
    • 一 , 泛型 (Generics) 概述
    • 二 , 泛型的主要功能
    • 三 , 泛型的基本概念
    • 四 , 泛型的使用场景
    • 五 , 泛型的基本步骤
    • 六 , 泛型的优缺点
    • 七 , 示例代码
  • 什么是反射?
    • 一 , 反射 (Reflection) 概述
    • 二 , 反射的主要功能
      • 1 . 获取类的信息
      • 2 . 创建对象
      • 3 . 访问私有成员
      • 4 . 调用方法
      • 5 . 设置字段值
    • 三 , 反射的使用场景
      • 1. 框架开发
      • 2. 动态代理
      • 3. 插件系统
      • 4. 测试工具
    • 四 , 反射的基本步骤
      • 1. 获取`Class`对象
      • 2. 获取类的成员信息
      • 3. 创建对象
      • 4. 调用方法
      • 5. 设置字段值
    • 五 , 反射的优缺点
      • 优点
      • 缺点
    • 六 , 示例代码

什么是泛型?

一 , 泛型 (Generics) 概述

泛型是Java编程语言的一项重要特性,它允许在定义类、接口和方法时使用类型参数。通过泛型,可以编写更加通用和类型安全的代码,避免了类型转换的繁琐和潜在的类型错误。

二 , 泛型的主要功能

  1. 类型安全

    • 泛型确保编译时的类型安全,避免了运行时的类型转换错误。
  2. 代码复用

    • 通过泛型,可以编写通用的类和方法,减少重复代码。
  3. 消除类型转换

    • 使用泛型后,编译器会自动进行类型转换,提高了代码的可读性和安全性。

三 , 泛型的基本概念

  1. 类型参数
    • 在定义类、接口或方法时使用的占位符,表示具体的类型。
    • 例如:List<T> 中的 T 就是一个类型参数。
  2. 类型参数的限定
    • 可以对类型参数进行限定,指定它可以接受的类型范围。
    • 例如:List<? extends Number> 表示列表中的元素必须是 Number 或其子类。
  3. 泛型类
    • 带有类型参数的类。
    • 例如:class Box<T> { ... }
  4. 泛型接口
    • 带有类型参数的接口。
    • 例如:interface List<T> { ... }
  5. 泛型方法
    • 带有类型参数的方法。
    • 例如:<T> T getFirst(List<T> list) { ... }

四 , 泛型的使用场景

  1. 集合类
    • 泛型最常用在集合类中,如 List<T>、Set<T> Map<K, V> 等。
    • 例如:List<String> 表示一个存储字符串的列表。
  2. 自定义类和接口
    • 可以在自定义类和接口中使用泛型,使其更加通用。
    • 例如:class Pair<K, V> { ... }
  3. 方法参数和返回值
    • 方法可以使用泛型参数和返回值,提高方法的通用性。
    • 例如:<T> T findFirst(List<T> list) { ... }

五 , 泛型的基本步骤

  1. 定义泛型类或接口
    • 在类或接口的声明中添加类型参数。
    • 例如:class Box<T> { ... }
  2. 使用泛型类或接口
    • 在实例化类或实现接口时指定具体的类型参数。
    • 例如:Box<String> box = new Box<>();
  3. 定义泛型方法
    • 在方法的返回类型前添加类型参数。
    • 例如:<T> T getFirst(List<T> list) { ... }
  4. 调用泛型方法
    • 调用泛型方法时,编译器会自动推断类型参数。
    • 例如:String first = getFirst(list);

六 , 泛型的优缺点

  • 优点
    • 类型安全:编译时检查类型,避免运行时的类型转换错误。
    • 代码复用:泛型类和方法可以处理多种类型的对象,减少了代码冗余。
    • 消除类型转换:编译器自动进行类型转换,提高了代码的可读性和安全性。
  • 缺点
    • 复杂性增加:泛型增加了代码的复杂性,特别是对于初学者来说。
    • 性能影响:泛型在编译时会进行类型擦除,可能会导致一些性能开销。

七 , 示例代码

// 定义一个泛型类
class Box<T> {private T item;public Box(T item) {this.item = item;}public T getItem() {return item;}public void setItem(T item) {this.item = item;}
}// 定义一个泛型方法
public class GenericExample {public static <T> void printItem(Box<T> box) {System.out.println("Item: " + box.getItem());}public static void main(String[] args) {// 使用泛型类Box<String> stringBox = new Box<>("Hello");Box<Integer> integerBox = new Box<>(123);// 调用泛型方法printItem(stringBox);  // 输出: Item: HelloprintItem(integerBox); // 输出: Item: 123}
}

什么是反射?

一 , 反射 (Reflection) 概述

  • 反射是Java编程语言的一个强大特性,它允许程序在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法
  • 反射机制为Java提供了极大的灵活性,使得程序员可以在运行时访问或“自省”程序的内部属性。

二 , 反射的主要功能

1 . 获取类的信息

  • 获取类的名称、父类、实现的接口等。
  • 获取类的构造器、方法、字段等成员信息。

2 . 创建对象

  • 通过类的构造器动态创建对象实例。

3 . 访问私有成员

  • 访问类的私有字段和方法,即使它们通常对外部不可见。

4 . 调用方法

  • 动态调用类的方法,包括私有方法。

5 . 设置字段值

  • 动态设置类的字段值,包括私有字段。

三 , 反射的使用场景

1. 框架开发

  • 许多Java框架(如Spring、Hibernate)广泛使用反射来实现依赖注入、ORM等功能。

2. 动态代理

  • 用于创建动态代理类,实现AOP(面向切面编程)等功能。

3. 插件系统

  • 允许应用程序在运行时加载和使用外部插件。

4. 测试工具

  • 测试工具可以使用反射来访问和修改私有成员,进行更全面的测试。

四 , 反射的基本步骤

1. 获取Class对象

通过类名、对象实例或类加载器获取Class对象。

2. 获取类的成员信息

使用Class对象的getDeclaredFieldsgetDeclaredMethods等方法获取类的字段和方法信息。

3. 创建对象

使用Class对象的newInstance方法或Constructor对象的newInstance方法创建对象实例。

4. 调用方法

使用Method对象的invoke方法调用类的方法。

5. 设置字段值

使用Field对象的set方法设置字段值。

五 , 反射的优缺点

优点

  • 灵活性高:可以在运行时动态地操作类和对象。
  • 扩展性强:支持插件化开发,增强系统的可扩展性。
  • 测试方便:可以访问私有成员,便于单元测试。

缺点

  • 性能开销大:反射操作比直接调用方法或访问字段要慢。
  • 安全性问题:可以访问私有成员,可能导致安全漏洞。
  • 代码可读性差:反射代码通常比较复杂,不易阅读和维护。

六 , 示例代码

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;public class ReflectionExample {public static void main(String[] args) {try {// 获取Class对象Class<?> clazz = Class.forName("java.util.ArrayList");// 获取类名System.out.println("类名: " + clazz.getName());// 获取所有公有构造器Constructor<?>[] constructors = clazz.getConstructors();for (Constructor<?> constructor : constructors) {System.out.println("构造器: " + constructor);}// 获取所有公有方法Method[] methods = clazz.getMethods();for (Method method : methods) {System.out.println("方法: " + method);}// 获取所有公有字段Field[] fields = clazz.getFields();for (Field field : fields) {System.out.println("字段: " + field);}// 创建对象Object obj = clazz.newInstance();System.out.println("创建的对象: " + obj);} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {e.printStackTrace();}}
}

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

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

相关文章

oracle 行转列(PIVOT 多个行数据按照指定的列进行汇总) 列转行(UNPIVOT)

-- PIVOT是Oracle 11g版本引入的一个功能, 用来做行转列 -- as count1 as count2必须加上, 这样列名就没有引号了使用场景&#xff1a;PIVOT常用于数据透视、数据汇总和数据展示等场景&#xff0c;例如将多个行数据按照指定的列进行汇总&#xff0c;生成一条汇总数据&#xf…

如何对网络设备进行监控:以监控易平台为例

随着信息技术的飞速发展&#xff0c;运维行业正面临着前所未有的挑战。设备的多样性、复杂性以及业务需求的不断变化&#xff0c;都对运维团队提出了更高的要求。在这样的背景下&#xff0c;监控易平台应运而生&#xff0c;为运维团队提供了一种高效、全面的设备监控解决方案。…

java包的使用

在Java中&#xff0c;包&#xff08;package&#xff09;用于组织类和接口。它们提供了一种将相关的类和接口组织在一起的方式&#xff0c;使得代码更具可读性和可维护性。 要使用一个Java包&#xff0c;需要以下几个步骤&#xff1a; 在Java源代码文件的开头使用package关键字…

C++STL之stack

1.stack的使用 函数说明 接口说明 stack() 构造空的栈 empty() 检测 stack 是否为空 size() 返回 stack 中元素的个数 top() 返回栈顶元素的引用 push() 将元素 val 压入 stack 中 pop() 将 stack 中尾部的元素弹出 2.stack的模拟实现 #include<vector> namespace abc { …

Web3.0技术入门

Web3.0技术入门是一个涉及多个方面和领域的复杂过程&#xff0c;以下是一些关键的步骤和要点&#xff0c;帮助您初步了解并掌握Web3.0技术。 一、了解Web3.0的基本概念 Web3.0也被称为下一代互联网&#xff0c;它是对当前互联网&#xff08;Web2.0&#xff09;的演进和升级。…

LeetCode 热题 100之普通数组

1.最大子数组和 思路分析&#xff1a;这个问题可以通过动态规划来解决&#xff0c;我们可以使用Kadane’s Algorithm&#xff08;卡登算法&#xff09;来找到具有最大和的连续子数组。 Kadane’s Algorithm 的核心思想是利用一个变量存储当前的累加和 currentSum&#xff0c;并…

MATLAB生物细胞瞬态滞后随机建模定量分析

&#x1f3af;要点 基于随机动态行为受化学主方程控制&#xff0c;定量分析单细胞瞬态效应。确定性常微分方程描述双稳态和滞后现象。通过随机性偏微分方程描述出暂时性滞后会逐渐达到平稳状态&#xff0c;并利用熵方法或截断方法计算平衡收敛速度的估计值。随机定量分析模型使…

python查询并安装项目所依赖的所有包

引言 如果需要进行代码的移植&#xff0c;肯定少不了在另一台pc或者服务器上进行环境的搭建&#xff0c;那么首先是要知道在已有的工程的代码中用到了哪些包&#xff0c;此时&#xff0c;如果是用人工去一个一个的代码文件中去查看调用了哪些包&#xff0c;这个工作甚是繁琐。…

Flutter 鸿蒙next中的路由使用详解【基础使用】

✅近期推荐&#xff1a;求职神器 https://bbs.csdn.net/topics/619384540 &#x1f525;欢迎大家订阅系列专栏&#xff1a;flutter_鸿蒙next &#x1f4ac;淼学派语录&#xff1a;只有不断的否认自己和肯定自己&#xff0c;才能走出弯曲不平的泥泞路&#xff0c;因为平坦的大路…

C++《vector的模拟实现》

在之前《vector》章节当中我们学习了STL当中的vector基本的使用方法&#xff0c;了解了vector当中各个函数该如何使用&#xff0c;在学习当中我们发现了vector许多函数的使用是和我们之前学习过的string类的&#xff0c;但同时也发现vector当中一些函数以及接口是和string不同的…

Page Cache(页缓存

Page Cache&#xff08;页缓存&#xff09;是操作系统中一种重要的缓存机制&#xff0c;主要用于提高系统对磁盘访问的性能。以下是对Page Cache的详细解释&#xff1a; 一、定义与功能 Page Cache&#xff0c;即页缓存&#xff0c;是操作系统内核管理的一部分内存区域。它将…

H5实现PDF文件预览,使用pdf.js-dist进行加载

H5实现PDF文件预览&#xff0c;使用pdf.js-dist进行加载 一、应用场景 在H5平台上预览PDF文件是在原本已经开发完成的系统中新提出的需求&#xff0c;原来的系统业务部门是在PC端进行PDF的预览与展示&#xff0c;但是现在设备进行了切换&#xff0c;改成了安卓一体机进行文件…

基于neo4j的课程资源生成性知识图谱

你是不是还在为毕业设计苦恼&#xff1f;又或者想在课堂中进行知识的高效管理&#xff1f;今天给大家分享一个你一定会感兴趣的技术项目——基于Neo4j的课程资源生成性知识图谱&#xff01;&#x1f4a1; 这套系统通过知识图谱的形式&#xff0c;将课程资源、知识点和学习路径…

前端页面样式没效果?没应用上?

当我们在开发项目时会有很多个页面、相同的标签&#xff0c;也有可能有相同的class值。样式设置的多了&#xff0c;分不清哪个是当前应用的。我们可以使用网页的开发者工具。 在我们开发的网页中按下f12或&#xff1a; 在打开的工具中我们可以使用元素选择器&#xff0c;单击我…

渗透测试-百日筑基—SQL注入篇时间注入绕过HTTP数据编码绕过—下

day8-渗透测试sql注入篇&时间注入&绕过&HTTP数据编码绕过 一、时间注入 SQL注入时间注入&#xff08;也称为延时注入&#xff09;是SQL注入攻击的一种特殊形式&#xff0c;它属于盲注&#xff08;Blind SQL Injection&#xff09;的一种。在盲注中&#xff0c;攻击…

【C++】Map()函数

在 C 中&#xff0c;map 是一个关联容器&#xff0c;它存储键值对&#xff0c;每个键都是唯一的&#xff0c;键和值之间存在一对一的映射关系。map 是基于红黑树实现的&#xff0c;因此它提供了对元素的有序存储和高效的查找能力。 1. 基本用法 map 的基本语法如下&#xff1…

基于丑萌气质狗--C#的sqlserver学习

#region 常用取值 查询List<string> isName new List<string> { "第一", "第二", "第三", "第四" }; List<string> result isName.Where(m > m "第三").ToList();MyDBContext myDBnew MyDBContext(…

如何对群辉docker进行简单更新升级

目前群辉container manager的docker管理程序,无法正常使用docker注册表,导致docker项目无法通过注册表进行部署。 管理程序注册表无法正常使用的情况下,我们可以尝试通过后台命令的方式进行拉取部署,docker更新也是如此。 本文教程主要通过docker compose这个工具进行部署…

web3对象如何连接以太网络节点

实例化web3对象 当我们实例化web3对象&#xff0c;我们一般开始用本地址&#xff0c;如下 import Web3 from web3 var web3 new Web3(Web3.givenProvider || ws://localhost:5173)我们要和以太网进行交互&#xff0c;所以我们要将’ws://localhost:5173’的本地地址换成以太…

隨筆 20241023 Kafka 事务

Kafka 事务概述 原子性要求&#xff1a;在需要将数据同时发送到多个 broker 中的不同分区时&#xff0c;使用事务可以确保这些操作具备原子性&#xff0c;确保要么全部成功&#xff0c;要么全部失败。 事务标记&#xff1a;在开启事务时&#xff0c;每一个发往不同分区的消息都…