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.hqwc.cn/news/86480.html

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

相关文章

【力扣周赛】第 111 场双周赛(状态机数位DP)⭐

文章目录 比赛链接Q1&#xff1a;6954. 统计和小于目标的下标对数目解法1—— O ( n 2 ) O(n^2) O(n2)暴力解法2——排序双指针 O ( n log ⁡ n ) O(n\log{n}) O(nlogn) Q2&#xff1a;8014. 循环增长使字符串子序列等于另一个字符串双指针相似题目——392. 判断子序列 Q3&…

Linux下jenkins全量迁移到新服务器

文章目录 1、目的2、迁移1&#xff09;查看jenkins的主目录2&#xff09;登录要迁出的服务器打包3&#xff09;找到对应的war包4&#xff09;登录对应迁入服务&#xff0c;上传war包和打包的jenkins数据等5&#xff09;在新的服务器解压迁入的数据等&#xff0c;并查看端口是否…

AUTOSAR系列专题--诊断模块(下)

往期小怿向各位小伙伴介绍了&#xff0c;文章内容过多分为了两期&#xff0c;本期为大家介绍《AUTOSAR模块之诊断篇&#xff08;下&#xff09;》。 目录 1.概述 2.DCM 3.DEM 4.FIM 5.结语 点击查看前文&#xff1a;AUTOSAR系列专题--诊断模块&#xff08;上&#xff09;…

【Java 中级】一文精通 Spring MVC - 数据格式化器(六)

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

小红书口碑营销技巧有哪些,打造独特品牌内容

作为一款社交电商平台&#xff0c;从目前来看&#xff0c;其实小红书也算是比较不错的口碑营销传播平台了。今天就来带大家一起分享下&#xff0c;小红书口碑营销技巧有哪些&#xff0c;打造独特品牌内容&#xff01; ​ 一、小红书口碑营销怎么做 1. 了解目标用户 首先需要明…

nginx代理webSocket链接,webSocket频繁断开重连

一、场景 1、使用nginx代理webSocket链接&#xff0c;消息发送和接收都是正常的&#xff0c;但webSocket链接会频繁断开重连 2、如果不使用nginx代理则一切正常 3、程序没有做webSocket心跳处理 如下图 二、nginx代理配置 upstream cloud_ass {#ip_hash;server 192.168.1.…

前端如何走通后端接口

0 写在前面 现在基本都是前后端分离的项目了&#xff0c;那么前端小伙伴如何获取后端小伙伴接口呢&#xff1f; 1 条件 同一WiFi下&#xff0c;让后端小伙伴分享出自己的ip地址&#xff1a; 步骤1:winr调出运行界面 步骤2&#xff1a;cmd调出命令行窗口 步骤3&#xff1a;…

C#,《小白学程序》第三课:类、类数组与排序

1 文本格式 /// <summary> /// 同学信息类 /// </summary> public class Classmate { /// <summary> /// 学号 /// </summary> public int Id; /// <summary> /// 姓名 /// </summary> public string Nam…

小研究 - Android 字节码动态分析分布式框架(五)

安卓平台是个多进程同时运行的系统&#xff0c;它还缺少合适的动态分析接口。因此&#xff0c;在安卓平台上进行全面的动态分析具有高难度和挑战性。已有的研究大多是针对一些安全问题的分析方法或者框架&#xff0c;无法为实现更加灵活、通用的动态分析工具的开发提供支持。此…

【C++】初始化列表

前言&#xff1a;这个知识点的细节比较多&#xff0c;且有些细节不太容易理解&#xff0c;要做好准备哟&#x1f47b; Ⅰ.构造函数的不完美&#x1f62d; 初始化列表&#xff0c;顾名思义&#xff0c;用列表一样的格式将其初始化。 &#x1f914;奇怪啊&#xff0c;构造函数的…

【Ubuntu 20.04 安装 搜狗输入法】细节注意

建议下载地址为&#xff1a; 搜狗拼音下载地址-Linux 也即是这个主页&#xff1a;适配Ubuntu20.04 安装过程根据官方文档即可 即 官方安装文档 一般不会出错

Vue2向Vue3过度Vuex状态管理工具快速入门

目录 1 Vuex概述1.是什么2.使用场景3.优势4.注意&#xff1a; 2 需求: 多组件共享数据1.创建项目2.创建三个组件, 目录如下3.源代码如下 3 vuex 的使用 - 创建仓库1.安装 vuex2.新建 store/index.js 专门存放 vuex3.创建仓库 store/index.js4 在 main.js 中导入挂载到 Vue 实例…