当前位置: 首页 > article >正文

Java学习打卡-Day25-注解和反射、Class类

注解(JDK5引入)

什么是注解?
  • Java注解(Annotation),也叫元数据。一种代码级别的说明,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
作用
  • 不是程序,但能对程序做出解释。
  • 还可以被其他程序读取。
格式
  • @+注释名。还可以添加一些参数。
  • 如:@SuppressWarnings(value="unchecked")
如何使用
  • 可以附加在 package、 class、 method、 field 等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。
内置注解(预定义的注解)
  • 以下注解都是java.lang包下的,也就是Java提供的基础注解,我们在使用的时候是不需要导包的!
    • @Override:标记一个方法,该方法打算重写超类中的某一方法。如果被标记的方法并没有实际重写超类中的方法,则编译器会发出错误警告。
    • @Deprecated:可以用在方法,属性,类上,表示不推荐程序员使用,因为有风险或存在更好的选择。
    • @SuppressWarnings:取消一些编译器产生的警告,需要添加参数才能正确使用,这些参数都是已经定义好了的,我们选择性的使用就好了。
    • @SafeVarargs:在声明具有模糊类型(如泛型)的可变参数构造函数或方法时,Java编译器会报unchecked警告。鉴于这些情况,如果程序员断定声明的构造函数和方法的主体不会对其varargs参数执行潜在的不安全的操作,可使用@SafeVarargs进行标记,这样的话,Java编译器就不会报unchecked警告。注意:方法必须是由static或者final修饰的方法!只能用于标记构造函数和方法!只能用在可变长参数的方法上!
      @SafeVarargs
      public static <T> T useVarargs(T... args) {  return args.length > 0 ? args[0] : null;  
      } 
      
    • @FunctionalInterface:被@FunctionalInterface注解标记的类型表明这是一个函数接口。从概念上讲,函数接口只有一个抽象方法。一旦不满足函数接口,就会报错。
元注解
  • 以下注解都来源于java.lang.annotation,元注解只能用来注解其他注解。
    • @Target:用于描述注解的使用范围。如@Target({ElementType.TYPE, ElementType.METHOD}),就代表着其修饰的注解可以用在 接口、类、枚举、注解上、还可以用在方法上!

      @Target(ElementType.TYPE) —— 接口、类、枚举、注解
      @Target(ElementType.FIELD) ——字段、枚举的常量
      @Target(ElementType.METHOD) —— 方法
      @Target(ElementType.PARAMETER) —— 方法参数
      @Target(ElementType.CONSTRUCTOR) —— 构造函数
      @Target(ElementType.LOCAL_VARIABLE) —— 局部变量
      @Target(ElementType.ANNOTATION_TYPE) —— 注解
      @Target(ElementType.PACKAGE) —— 包

    • @Retention:用于描述注解的生命周期,表示需要在什么级别保存该注解信息。

      RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;也就是编译时有效。
      RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;加载时被抛弃。
      RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;一直有效!

    • @Documented:说明该注解将被包含在javadoc中。如果一个注解@A被@Documented标注,那么被@A修饰的类,生成文档时,就会显示该注解@A。

    • @Inherited:如果一个类用上了@Inherited修饰的注解@A,那么其子类也会继承这个注解@A。

自定义注解
  • 使用关键字@interface来声明一个注解。
  • 访问修饰符必须为public,不写默认为pubic。
  • 配置参数:返回类型+参数名+()。返回类型只能是基本类型、Class、String、enum。
  • 注解参数必须要有值,可以通过default来声明参数的默认值。如果没有默认值,则必须赋值。
  • 如果只有一个参数成员,一般参数名为value。

反射

什么是反射?
  • Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。Java注解一旦离开了反射就什么都不是!!!
  • 加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象包含了完整的类的结构信息。这个对象就像一面镜子,透过这个镜子我们可以看到类的结构,所以我们形象的称之为反射。
  • Class对象照镜子后可以得到的信息:某个类的属性、方法、构造器,实现了哪些接口。
功能
  • 在运行时判断任意一个对象所属的类。
  • 在运行时构造任意一个类的对象。
  • 在运行时判断任意一个类所具有的成员变量和方法。
  • 在运行时获取泛型信息。
  • 在运行时调用任意一个对象的成员变量和方法。
  • 在运行时处理注解。
  • 生成动态代理。
优缺点
  • 优点:体现出灵活性,可以实现动态创建和使用对象。
  • 缺点:对性能有影响,使用反射基本上是一种解释操作,这类操作总是慢于直接执行相同的操作。
Class 类
  • Class 类就是一个类,同样继承自Object类。
  • Class 对象不是new出来的,而是由JVM创建的,通过ClassLoader加载某类的Class对象。我们只能通过反射得到。
  • 某个类在JVM中只能有一个Class对象,因为类只加载一次。
  • 一个Class对象对应的是加载到JVM的一个.class文件
  • Class类是反射的根源,任何你想动态加载、运行的类,唯有先获得对应的Class对象。通过Class对象可以得到一个类的完整结构,借助一系列API。
Class 类方法
String str ="com.hspedu.reflection.Person";
//获取到Class对象,?表示不确定的java类型
Class<?> clazz = Class.forName(str);System.out.println(clazz);//输出该clazz是哪个类的Class对象->class com.hspedu.reflection.Person
System.out.println(clazz.getName());//全类名->com.hspedu.reflection.Person
System.out.println(clazz.getPackage().getName());//包名->com.hspedu.reflection
System.out.println(clazz.getClass());//运行类型->class java.lang.ClassObject obj= clazz.newlnstance(); //通过反射创建对象
Field field = clazz.getField("name"); //通过反射获取属性(只能获取公有)
System.out.println(field.get(obj));//输出field.set(obj,"hspedu"); // 通过反射给属性赋值
System.out.println(field.get(obj));//输出Field[] fields = clazz.getFields();//通过反射获取所有属性(只能获取公有)
for(Field f : fields){System.out.println(f.getName());//输出所有属性的名称System.out.println(f.get(obj));//输出所有属性的值
}
Class 对象的获取方式
  • 编译阶段:已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException。如:Class cls1 = Class.forName( "java.lang.Cat"); 应用场景:多用于配置文件,读取类全路径,加载类。
  • 类加载阶段:已知具体的类,通过类的.class获取,该方式最为安全可靠,程序性能最高。如:Class cls2 = Cat.class; 应用场景:多用于参数传递,比如通过反射得到对应构造器对象。
  • 运行阶段:已知某个类的实例,调用该实例的getClass()方法获取Class对象。如:Class cls3 = 对象.getClass();应用场景:通过创建好的对象,获取Class对象。
  • 通过类加载器:(1)先得到类加载器 ClassLoader classLoader = 对象.getClass().getclassLoader();(2)通过类加载器得到Class对象Class cls4 = classLoader.loadclass(classAllPath);
  • 对于基本数据类型:Class cls5 = 基本数据类型.class;
  • 对于基本数据类型的包装类:Class cls6 = 包装类.TYPE;

相关文章:

Java学习打卡-Day25-注解和反射、Class类

注解&#xff08;JDK5引入&#xff09; 什么是注解&#xff1f; Java注解&#xff08;Annotation&#xff09;&#xff0c;也叫元数据。一种代码级别的说明&#xff0c;与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面&#xf…...

电感、互感器、变压器和磁珠综合对比——《器件手册--电感/线圈/变压器/磁珠篇》

三、电感/线圈/变压器/磁珠 名称 定义 特点...

CAD导入arcgis中保持面积不变的方法

1、加载CAD数据&#xff0c;选择面数据&#xff0c;如下&#xff1a; 2、加载进来后&#xff0c;右键导出数据&#xff0c;导出成面shp数据&#xff0c;如下&#xff1a; 3、选择存储路径&#xff0c;导出面后计算面积&#xff0c;如下&#xff1a; 4、与CAD中的闭合线面积核对…...

rustdesk自建服务器怎么填写客户端配置信息

目录 # id、api、中继都怎么填&#xff1f;rustdesk程序启动后服务不自动启动 # id、api、中继都怎么填&#xff1f; rustdesk程序启动后服务不自动启动 完全退出RudtDesk程序&#xff08;右下角托盘区有的话&#xff0c;需要右键点退出&#xff09; 创建windows服务&#xff…...

c++进阶之----智能指针

1.概念 在 C 中&#xff0c;智能指针是一种特殊的指针类型&#xff0c;它封装了裸指针&#xff08;raw pointer&#xff09;的行为&#xff0c;并通过 RAII&#xff08;Resource Acquisition Is Initialization&#xff0c;资源获取即初始化&#xff09;机制自动管理动态分配的…...

六、测试分类

设计测试用例 万能公式&#xff1a;功能测试性能测试界面测试兼容性测试安全性测试易用性测试 弱网测试&#xff1a;fiddler上行速率和下行速率 安装卸载测试 在工作中&#xff1a; 1.基于需求文档来设计测试用例&#xff08;粗粒度&#xff09; 输入字段长度为6~15位 功…...

Apollo源码总结

官方课程 项目源码 源码库简介&#xff1a; 1.apollo&#xff1a;算法库 2.apollo-kernel&#xff1a;改进LINUX内核。添加实时性补丁。 3. apollo-platform&#xff1a;改进ROS系统。去中心化&#xff0c;增加共享内存通信方式&#xff0c;兼容protobuf。 4.apollo-contrib&am…...

电感详解:定义、作用、分类与使用要点

一、电感的基本定义 电感&#xff08;Inductor&#xff09; 是由导线绕制而成的储能元件&#xff0c;其核心特性是阻碍电流变化&#xff0c;将电能转化为磁能存储。 基本公式&#xff1a; 自感电动势&#xff1a; E -L * (di/dt) &#xff08;L&#xff1a;电感值&#xff0c…...

AI编程案例拆解|基于机器学习XX评分系统-前端篇

文章目录 1. 定价使用DeepSeek估价小红书调研 2. 确定工作事项利用DeepSeek生成具体工作事项 3. 和客户沟通约会议沟通确定内容样式 4. 前端部分设计使用DeepSeek生成UI设计在Cursor中生成并提问前置条件开始编程 关注不迷路&#xff0c;励志拆解100个AI编程、AI智能体的落地应…...

java数组06:Arrays类

Arrays类 数组的工具类java.util. Arrays 由于数组对象本身并没有什么方法可以供我们调用,但API中是了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。 查看JDK帮助文档 Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用…...

TQTT_KU5P开发板教程---实现流水灯

文档实现功能介绍 本文档是学习本开发板的基础&#xff0c;通过设置计数器使led0到led7依次闪烁&#xff0c;让用户初步认识vivado基本的开发流程以及熟悉项目的创建。本开发板的所有教程所使用的软件都是vivado2024.1版本的。可以根据网上的教程下载与安装。 硬件资源 此次教程…...

Model Context Protocol(MCP)模型上下文协议

Model Context Protocol&#xff08;MCP&#xff09;模型上下文协议 前言一、什么是MCP二、MCP的作用三、MCP与Function call对比四、构建一个简单的MCP DEMO环境准备实现MCP Server运行 ServerMCP Client端配置验证 总结 前言 在Agent时代&#xff0c;将Agent确立为大模型未来…...

第十二章:FreeRTOS多任务创建与删除

FreeRTOS多任务创建与删除教程 概述 本教程介绍FreeRTOS多任务的创建与删除方法&#xff0c;主要涉及两个核心函数&#xff1a; 任务创建&#xff1a;xTaskCreate()任务删除&#xff1a;vTaskDelete() 实践步骤 1. 准备工程文件 复制005工程并重命名为006 2. 创建多个任务…...

Seed-Thinking-v1.5:字节豆包新推理模型发布,200B参数战胜Deepseek

摘要 本文引入了Seed-Thinking-v1.5&#xff0c;能够在响应之前通过思考进行推理&#xff0c;从而提高了各种基准测试的性能。Seed-Thinking-v1.5在AIME 2024上获得86.7分&#xff0c;在Codeforces上获得55.0分&#xff0c;在GPQA上获得77.3分&#xff0c;展示了优秀的STEM和编…...

C#.NET模拟用户点击按钮button1.PerformClick自动化测试

PerformClick英文词是什么意思,几个词组成 PerformClick 是一个由两个英文单词组成的合成词&#xff0c;下面为你分别解释每个部分的含义以及整个词在编程语境中的意义&#xff1a; 单个单词含义 Perform&#xff1a;它是一个动词&#xff0c;读音为 /pəˈfɔːm/&#xff…...

微服务之间调用外键“翻译”的方法概述

写在前面的话&#xff1a;减少strean流操作&#xff0c;减少多层嵌套for循环。使用普通for循环和map的方式进行转换&#xff0c; 第一步查询数据 List<Student> findList studentDao.findList(findMap); 第二步准备遍历和赋值 if(CollectionUtil.isNotEmpty(findLis…...

AIDD-人工智能药物设计-提升分子预测反事实解释可靠性

UQ 过滤:提升分子预测反事实解释可靠性 目录 I-INF 指标结合 F1 评分,为评估大分子复合物(包括 RNA-蛋白质)的界面相互作用网络提供了可靠且全面的新方法。通过使用生成的人工 CAR 序列微调蛋白质语言模型(PLM),显著提高了 CAR-T 细胞活性的预测准确性,有效克服了合成蛋…...

软件界面设计:打造用户喜爱的交互体验

在数字化飞速发展的当下&#xff0c;软件已渗透进生活的各个角落&#xff0c;从日常使用的社交、购物软件&#xff0c;到专业领域的办公、设计软件&#xff0c;其重要性不言而喻。而软件界面作为用户与软件交互的桥梁&#xff0c;直接决定了用户对软件的第一印象与使用体验。出…...

【前端】webpack一本通

今日更新完毕&#xff0c;不定期补充&#xff0c;建议关注收藏点赞。 目录 简介使用webpack默认只能处理js文件 ->引入加载器对JS语法降级&#xff0c;兼容低版本语法合并文件再次打包进阶 工作原理html-webpack-plugin插件webpack开发服务器引入使用webpack-dev-server模块…...

代码学习总结(一)

代码学习总结&#xff08;一&#xff09; 这个系列的博客是记录下自己学习代码的历程&#xff0c;有来自平台上的&#xff0c;有来自笔试题回忆的&#xff0c;主要基于 C 语言&#xff0c;包括题目内容&#xff0c;代码实现&#xff0c;思路&#xff0c;并会注明题目难度&…...

DeepSeek在应急救援领域的应用解决方案

DeepSeek在应急救援领域的应用解决方案 一、引言 1.1 应急救援领域现状 近年来&#xff0c;我国应急管理工作全面加强&#xff0c;取得了显著成效。然而&#xff0c;一系列重特大灾害事故暴露出我国应急管理体系存在诸多问题短板。例如&#xff0c;在责任落实、应急处突、法…...

第十五届蓝桥杯C/C++B组省赛真题讲解(分享去年比赛的一些真实感受)

试题A——握手问题 一、解题思路 直接用高中学的排列组合思路 二、代码示例 #include<bits/stdc.h> using namespace std; int fun(int n) {int sum0;for(int i0;i<n;i){for(int ji1;j<n;j)sum; } return sum; } int main() {cout<<fun(50)-fun(7); }三、…...

【Qt】qDebug() << “中文测试“; 乱码问题

环境 Qt Creator版本&#xff1a;4.7.1 编译器&#xff1a;MSVC2015_32bit 解法一 在.pro文件中添加 msvc:QMAKE_CXXFLAGS -execution-charset:utf-8注意&#xff1a; 1、需要清理项目&#xff0c;并重新qmake&#xff0c;然后构建。 测试项目下载&#xff1a;https://do…...

Koordinator-NodeSLO

Reconcile() 获取node和nodeSLO&#xff0c;设置nodeExist和nodeSLOExistnode和nodeSLO都不存在&#xff0c;直接返回若!nodeExist 删除对应nodeSLO 若!nodeSLOExist 初始化nodeSLO创建nodeSLO 若nodeExist和nodeSLOExist都存在 获取nodeSLOSpec&#xff0c;若nodeSLOSpec改变…...

Vue接口平台学习六——接口列表及部分调试页面

一、实现效果图及界面布局简单梳理 整体布局分左右&#xff0c;左边调试&#xff0c;右边显示接口列表 左侧&#xff1a; 一个输入框按钮&#xff1b;下面展示信息&#xff0c;大部分使用代码编辑器就好了&#xff0c;除了请求体传文件类型需要额外处理。然后再下方显示响应信…...

2025年消防设施操作员考试题库及答案

一、多选题 31.区域报警系统主要由&#xff08;&#xff09;等组成。 A.火灾探测器 B.手动火灾报警按钮 C.火灾声光警报器 D消防联动控制器 E.区域型火灾报警控制器 答案&#xff1a;ABCE 解析&#xff1a;根据《基础知识》第215页&#xff0c;“消防联动控制器”一项可…...

【C语言】预处理(下)(C语言完结篇)

一、#和## 1、#运算符 这里的#是一个运算符&#xff0c;整个运算符会将宏的参数转换为字符串字面量&#xff0c;它仅可以出现在带参数的宏的替换列表中&#xff0c;我们可以将其理解为字符串化。 我们先看下面的一段代码&#xff1a; 第二个printf中是由两个字符串组成的&am…...

深入理解全排列算法:DFS与回溯的完美结合

全排列问题是算法中的经典问题&#xff0c;其目标是将一组数字的所有可能排列组合列举出来。本文将详细解析如何通过深度优先搜索&#xff08;DFS&#xff09;和回溯法高效生成全排列&#xff0c;并通过模拟递归过程帮助读者彻底掌握其核心思想。 问题描述 给定一个正整数 n&a…...

低频rfid手持机,助力动物耳标智能化管理

低频RFID手持机&#xff0c;助力动物耳标智能化管理&#xff0c;正逐步成为现代畜牧业不可或缺的工具。它不仅能够高效读取动物耳标中的信息&#xff0c;如唯一识别码、疫苗接种记录、健康状态等&#xff0c;还极大地提升了数据录入的准确性和时效性。 1.精准识别与追踪‌ 通过…...

【从零开始学习JVM | 第三篇】虚拟机的垃圾回收学习(一)

堆空间的基本结构 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时&#xff0c;Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。 Java 堆是垃圾收集器管理的主要区域&#xff0c;因此也被称作 GC 堆&#xff08;Garbage Collected Heap&am…...