【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,一经查实,立即删除!

相关文章

C++STL之stack

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

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;这个工作甚是繁琐。…

C++《vector的模拟实现》

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

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#的sqlserver学习

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

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

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

如何在短时间内入门并掌握深度学习?

如何在短时间内快速入门并掌握深度学习&#xff0c;是很多读者的困惑——晦涩难懂的数学 知识、复杂的算法、烦琐的编程……深度学习虽然让无数读者心怀向往&#xff0c;却也让不少人望而生畏&#xff0c;深感沮丧&#xff1a;时间没少花&#xff0c;却收效甚微。 如何才能更好…

python对文件的读写操作

任务:读取文件夹下的批量txt数据&#xff0c;并将其写入到对应的word文档中。 txt文件中包含&#xff1a;编号、报告内容和表格数据。写入到word当中&#xff1a;编号、报告内容、表格数据、人格雷达图以及对应的详细说明&#xff08;详细说明是根据表格中的标识那一列中的加号…

设计模式(二)工厂模式详解

设计模式&#xff08;二&#xff09;工厂模式详解 简单工厂模式指由一个工厂对象来创建实例,适用于工厂类负责创建对象较少的情况。例子&#xff1a;Spring 中的 BeanFactory 使用简单工厂模式&#xff0c;产生 Bean 对象。 工厂模式简介 定义&#xff1a;工厂模式是一种创建…

js构造函数和原型对象,ES6中的class,四种继承方式

一、构造函数 1.构造函数是一种特殊的函数&#xff0c;主要用来初始化对象 2.使用场景 常见的{...}语法允许创建一个对象。可以通过构造函数来快速创建多个类似的对象。 const Peppa {name: 佩奇,age: 6,sex: 女}const George {name: 乔治,age: 3,sex: 男}const Mum {nam…

pytorch的标签平滑介绍

什么是标签平滑(Label Smoothing)? 标签平滑(Label Smoothing)是一种正则化技术,旨在防止模型过度自信(即输出的概率分布过于“尖锐”)。在分类任务中,标准的目标标签是one-hot编码,也就是正确类别的概率为 1,其他类别的概率为 0。而标签平滑通过将正确类别的概率从…

小程序开发实战:PDF转换为图片工具开发

目录 一、开发思路 1.1 申请微信小程序 1.2 编写后端接口 1.3 后端接口部署 1.4 微信小程序前端页面开发 1.5 运行效果 1.6 小程序部署上线 今天给大家分享小程序开发系列&#xff0c;PDF转换为图片工具的开发实战&#xff0c;感兴趣的朋友可以一起来学习一下&#xff01…

基于Springboot无人驾驶车辆路径规划系统(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Hadoop:yarn的Rust API接口

今天头一次接触了yarn的Rust API接口&#xff0c;在本地搭建了集群&#xff0c;能够得到每个任务的详细信息。 (一)得到所有任务的所有信息命令&#xff1a; 默认是json格式&#xff0c;也可以指定xml的格式&#xff0c;如(curl --compressed -H "Accept: application/x…

【大模型理论篇】主流大模型的分词器选择及讨论(BPE/BBPE/WordPiece/Unigram)

1. 背景分析 分词是将输入和输出文本拆分成更小单位的过程&#xff0c;使得大模型能够处理。token可以是单词、字符、子词或符号&#xff0c;取决于模型的类型和大小。分词可以帮助模型处理不同的语言、词汇和格式&#xff0c;并降低计算和内存成本。分词还可以通过影响token的…