Java注解与反射

在这里插入图片描述

💗wei_shuo的个人主页

💫wei_shuo的学习社区

🌐Hello World !


Java注解与反射

Java注解和反射是Java语言中两个强大的特性,它们可以一起使用以实现动态的、灵活的编程和元数据处理

注解

Java注解(Annotations)是一种元数据,它提供了对代码的额外信息和标记。注解可以用于类、方法、字段和其他程序元素,用于提供编译时和运行时的信息。注解以@符号开头,放置在目标元素的前面

内置注解

@Override

@Override:用于标注方法,表示该方法覆盖了父类中的方法

@SuppressWarnings

@SuppressWarnings:抑制编译器产生的警告

@FunctionalInterface

@FunctionalInterface:标记接口为函数式接口,即只包含一个抽象方法的接口

@SafeVarargs

@SafeVarargs:用于标记可变参数方法是类型安全的

@Nullable

@Nullable:标记方法参数、字段或返回值可以为null

@NonNull

@NonNull:标记方法参数、字段或返回值不可为null

@Repeatable

@Repeatable:用于标记注解类型,表示该注解可以在同一个元素上重复使用

元注解

元注解(meta-annotation)是指用于注解其他注解的特殊注解;元注解在Java中用于对其他注解进行修饰和配置,从而改变其行为或提供额外的信息

元注解四大类型

@Target

指定了注解的目标元素,即注解可以应用于哪些Java元素,如类、方法、字段等

应用于类
@Target(ElementType.TYPE)
public @interface MyAnnotation {// ...
}
应用于方法
@Target(ElementType.METHOD)
public @interface MyAnnotation {// ...
}
应用于字段
@Target(ElementType.FIELD)
public @interface MyAnnotation {// ...
}
应用于参数
@Target(ElementType.PARAMETER)
public @interface MyAnnotation {// ...
}
应用于构造方法
@Target(ElementType.CONSTRUCTOR)
public @interface MyAnnotation {// ...
}
应用于局部变量
@Target(ElementType.LOCAL_VARIABLE)
public @interface MyAnnotation {// ...
}
应用于注解类型
@Target(ElementType.ANNOTATION_TYPE)
public @interface MyAnnotation {// ...
}

@Retention

指定了注解的保留策略,即注解在编译时、类加载时还是运行时可见

源码级别可见
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnnotation {// ...
}
编译时可见
@Retention(RetentionPolicy.CLASS)
public @interface MyAnnotation {// ...
}
运行时可见
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {// ...
}

@Documented

指定注解是否会出现在生成的Java文档中

@Documented
public @interface MyAnnotation {// ...
}

@Inherited

指示注解是否具有继承性,即注解是否可以被子类继承

@Inherited
public @interface MyAnnotation {// ...
}

自定义注解

自定义注解是在 Java 中定义的一种元数据,用于给程序元素(类、方法、字段等)添加额外的信息和属性;通过自定义注解,开发人员可以在程序中添加自己定义的元数据,以便在运行时使用反射获取这些注解并进行特定的处理

  • 定义注解
public @interface MyAnnotation {String value() default ""; // 注解属性,可以有默认值int count() default 0;
}
  • 使用注解
@MyAnnotation(value = "hello", count = 3)
public class MyClass {// ...
}
  • 获取注解元数据
Class<?> clazz = MyClass.class;
MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);
String value = annotation.value(); // 获取注解的 value 属性值
int count = annotation.count(); // 获取注解的 count 属性值

反射

反射(Reflection)是Java提供的一种机制,用于在运行时检查、访问和修改类、对象、方法和字段等程序元素;通过反射,我们可以在运行时获取类的信息,创建类的实例,调用类的方法和访问类的字段。反射使得我们可以在运行时动态地操作类和对象,而不需要提前知道它们的具体细节

在这里插入图片描述

反射机制核心类

  • Class类:代表一个类的描述信息,通过Class类可以获取类的构造函数、字段、方法、注解等信息
  • Constructor类:代表类的构造函数,通过Constructor类可以创建类的实例
  • Field类:代表类的字段,通过Field类可以获取和设置字段的值
  • Method类:代表类的方法,通过Method类可以调用方法
import java.lang.reflect.Method;public class ReflectionExample {public static void main(String[] args) throws Exception {// 获取类的 Class 对象Class<?> clazz = MyClass.class;// 获取指定方法名的 Method 对象Method method = clazz.getDeclaredMethod("myMethod");// 创建类的实例Object instance = clazz.getDeclaredConstructor().newInstance();// 调用方法method.invoke(instance);}
}// 定义一个示例类
class MyClass {public void myMethod() {System.out.println("Hello, reflection!");}
}

获取Class类方式

  • 使用类名的.class语法:可以直接使用类名的.class语法来获取一个类的Class对象
Class<?> clazz = MyClass.class;
  • 使用对象的getClass()方法:可以通过一个对象的getClass()方法来获取它所属类的Class对象
MyClass obj = new MyClass();
Class<?> clazz = obj.getClass();
  • 使用Class.forName()方法:可以通过类的全限定名使用Class.forName()方法来获取Class对象
Class<?> clazz = Class.forName("com.example.MyClass");

🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——点赞👍收藏⭐️评论📝


在这里插入图片描述

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

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

相关文章

c语言六子棋(Alpha-Beta剪枝算法)

c语言Alpha-Beta剪枝算法六子棋介绍 Alpha-Beta剪枝算法是一种用于优化博弈树搜索的算法&#xff0c;可以在搜索过程中减少不必要的计算&#xff0c;从而提高搜索效率。该算法常用于博弈游戏&#xff0c;如六子棋。 六子棋是一种类似于五子棋的棋类游戏&#xff0c;在一个六边形…

ubuntu20.04 编译安装运行emqx

文章目录 安装依赖编译运行登录dashboard压力测试 安装依赖 Erlang/OTP OTP 24 或 25 版本 apt-get install libncurses5-dev sudo apt-get install erlang如果安装的erlang版本小于24的话&#xff0c;可以使用如下方法自行编译erlang 1.源码获取 wget https://github.com/erla…

【大模型AIGC系列课程 3-2】国产开源大模型:ChatGLM

1. GLM https://arxiv.org/pdf/2103.10360.pdf GLM是General Language Model的缩写,是一种通用的语言模型预训练框架。它的主要目标是通过自回归的空白填充来进行预训练,以解决现有预训练框架在自然语言理解(NLU)、无条件生成和有条件生成等任务中表现不佳的问题。 具体来…

WPF网格拖动自动布局效果

WPF网格拖动自动布局效果 使用Canvas和鼠标相关事件实现如下的效果: XAML代码: <Window x:Class="CanvasTest.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:

java练习8.100m小球落地

题目: 如一个小球从100米高度自由落下&#xff0c;每次落地后就反跳回原高度的一半。 那么求它在第10次落地时&#xff0c;共经过多少米&#xff1f;第10次反弹多高&#xff1f; public static void main(String[] args) {/*假如一个小球从100米高度自由落下&#xff0c;每次落…

按软件开发阶段的角度划分:单元测试、集成测试、系统测试、验收测试

1.单元测试&#xff08;Unit Testing&#xff09; 单元测试&#xff0c;又称模块测试。对软件的组成单位进行测试&#xff0c;其目的是检验软件基本组成单位的正确性。测试的对象是软件里测试的最小单位&#xff1a;模块。 测试阶段&#xff1a;编码后或者编码前&#xff08;…

天润融通「微藤大语言模型平台2.0」以知识驱动企业高速增长

8月23日&#xff0c;天润融通&#xff08;又称“天润云”,2167.HK&#xff09;&#xff0c;正式发布「微藤大语言模型平台2.0」。 “大模型企业知识企业知识工程”。 “不能有效记录和管理知识的企业是不能持续进步的。在企业的生产流程中&#xff0c;相比于其他场景&#xff0…

com.mysql.jdbc.PacketTooBigException: Packet for query is too large(windows)

使用mysql查询数据的时候报错&#xff1a; Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1078 > 1024). You can change this value on the server by setting the max_allowed_packet variable. 这是因为mysql的server默认接受数据…

ISIS路由协议

骨干区域与非骨干区域 凡是由级别2组建起来的邻居形成骨干区域&#xff1b;级别1就在非骨干区域&#xff0c;骨干区域有且只有一个&#xff0c;并且需要连续&#xff0c;ISIS在IP环境下目前不支持虚链路。 路由器级别 L1路由器只能建立L1的邻居&#xff1b;L2路由器只能建立L…

IDEA启动两个Tomcat服务的方式 使用nginx进行反向代理 JMeter测试分布式情况下synchronized锁失效

目录 引出IDEA启动Tomcat两个端口的方式1.编辑配置2.添加新的端口-Dserver.port80833.service里面管理4.启动后进行测试 使用nginx进行反向代理反向代理多个端口运行日志查看启动关闭重启 分布式情况下synchronized失效synchronized锁代码启动tomcat两个端口nginx反向代理JMete…

VR智慧校园资中控管理平台综合提升了课堂教学质量

随着越来越多高校在课堂中引进VR虚拟仿真实训系统&#xff0c;为了方便老师对全班同学进行高效率地管理&#xff0c;VR中控平台应运而生。下面为您详细介绍VR中控平台在课堂教学中的应用优势。 VR中控系统安装在教师总控端&#xff0c;融合了课件、视频、3D动画等丰富的教学资源…

python+mysql+前后端分离国内职位数据分析(源码+文档+指导)

系统阐述的是使用国内python职位数据分析系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 Flask框架和MySql数据库技术搭建系统的整体…

二、数学建模之整数规划篇

1.定义 2.例题 3.使用软件及解题 一、定义 1.整数规划&#xff08;Integer Programming&#xff0c;简称IP&#xff09;&#xff1a;是一种数学优化问题&#xff0c;它是线性规划&#xff08;Linear Programming&#xff0c;简称LP&#xff09;的一个扩展形式。在线性规划中&…

ZeroMQ入门

官网: ZeroMQ 简介 ZeroMQ是一个库&#xff0c;不是消息队列也不是消息中间件&#xff0c;介于应用层和传输层之间&#xff08;按照TCP/IP划分&#xff09;。 传统的Socket通信模式需要创建连接&#xff0c;销毁连接&#xff0c;选择协议等一些列操作。而ZeroMQ是在Socket封…

【Java集合学习1】ArrayList集合学习及集合概述分析

JavaArrayList集合学习及集合学习概述 一、Java集合概述 Java 集合&#xff0c; 也叫作容器&#xff0c;主要是由两大接口派生而来&#xff1a;一个是 Collection接口&#xff0c;主要用于存放单一元素&#xff1b;另一个是 Map 接口&#xff0c;主要用于存放键值对。对于Col…

电商平台京东平台获得京东商品描述API接口演示案例

京东商品描述API接口可以获取京东商品描述&#xff1a; 详细介绍商品的特点和功能,让消费者能够了解商品的具体用途和效果。 使用简洁明了的语言,避免使用过于专业的术语和长句子,让消费者能够轻松理解。 重点突出商品的卖点和优势,让消费者能够更加清晰地了解商品的价值 …

AIGC时代开启!拓世数字人短视频点燃企业数字化转型热潮!

短视频在近年迎来了高速发展期&#xff0c;与初期满足人们的娱乐需求和社交需求相比&#xff0c;短视频平台如今已经成长为一个巨量信息汇聚、流转、辐散的综合性场所。特别是随着移动互联网的普及&#xff0c;碎片化信息传播需求的迅猛增长&#xff0c;各行各业的内容创作者都…

原生小案例:如何使用HTML5 Canvas构建画板应用程序

使用HTML5 Canvas构建绘图应用是在Web浏览器中创建交互式和动态绘图体验的绝佳方式。HTML5 Canvas元素提供了一个绘图表面&#xff0c;允许您操作像素并以编程方式创建各种形状和图形。本文将为您提供使用HTML5 Canvas创建绘图应用的概述和指导。此外&#xff0c;它还将通过解释…

2、结构型设计模式

结构型设计模式 目录 结构型设计模式1. 代理模式1.1 概述1.2 结构1.3 静态代理1&#xff09;抽象主题类 SellTickets2&#xff09;真实主题类 TrainStation3&#xff09;代理类 ProxyPoint4&#xff09;客户端类 1.4 JDK 动态代理1&#xff09;代理工厂类&#xff1a;ProxyFact…

C++类成员的访问权限以及类的封装

C通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限&#xff0c;它们分别表示公有的、受保护的、私有的&#xff0c;被称为成员访问限定符。所谓访问权限&#xff0c;就是你能不能使用该类中的成员。 Java、C# 程序员注意&#xff0c;C 中的 publ…