Java注解与反射

news2024/11/26 17:51:23

在这里插入图片描述

💗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.coloradmin.cn/o/938685.html

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

相关文章

振弦采集读数模块开发原理详细介绍

飞讯教学篇&#xff1a;振弦采集读数模块开发原理详细介绍 振弦采集读数模块是一种用于采集弦振信息的模块&#xff0c;其原理是通过传感器感知弦的振动&#xff0c;将其转化为电信号&#xff0c;然后经过模拟处理和数字化处理&#xff0c;最终输出为可供后续处理的数字信号。…

Python照片压缩教程:如何轻松减小图片大小

介绍 在日常的编程工作中&#xff0c;我们经常需要处理图像&#xff0c;例如上传、下载、显示、编辑等。有时候&#xff0c;我们需要对图像进行压缩&#xff0c;以减少占用的空间和带宽&#xff0c;提高加载速度和用户体验。那么&#xff0c;如何用Python来实现图像压缩呢&…

【数据分析】统计量

1. 均值、众数描述数据的集中趋势度量&#xff0c;四分位差、极差描述数据的离散程度。 2. 标准差、四分位差、异众比率度量离散程度&#xff0c;协方差是度量相关性。 期望值分别为E[X]与E[Y]的两个实随机变量X与Y之间的协方差Cov(X,Y)定义为&#xff1a; 从直观上来看&…

开源vue动态表单组件

一、项目简介 vueelement的动态表单组件&#xff0c;拖拽组件到面板即可实现一个表单 二、实现功能 支持拖拽 支持输入框 支持文本框 支持数字输入框 支持下拉选择器 支持多选框 支持日期控件 支持开关 支持动态表格 支持上传图片 支持上传文件 支持标签 支持ht…

无涯教程-Python机器学习 - Semi-supervised Learning函数

Python机器学习 中的 Semi - 无涯教程网无涯教程网提供https://www.learnfk.com/python-machine-learning/machine-learning-with-python-semi-supervised-learning.html

图像翻拍检测——反射分量分离的特征融合

随着计算机技术的迅速发展&#xff0c;需要建立人与信息一一对应的安保认证技术&#xff0c;通过建立完整的映射网络体系&#xff0c;从而确保每个人的人身、财产、隐私等的安全.与指纹、基因等人体生物特征识别系统相比&#xff0c;人脸识别系统更加友好&#xff0c;不需要人的…

【C语言】位操作符的一些题目与技巧

初学者在学完位操作符之后&#xff0c;总是不能很好的掌握&#xff0c;因此这篇文章旨在巩固对位操作符的理解与使用。 有的题目可能会比较难以接受&#xff0c;但是看完一定会有收获 目录 位操作符&#xff1a;一些题目&#xff1a;不创建临时变量交换整数整数转换二进制中1的…

【校招VIP】产品设计分析之思维整体性

考点介绍&#xff1a; 对于产品分析设计时需要全面的分析用户需求&#xff0c;而产品思维方式的核心是“以问题为核心”&#xff0c;即先多花时间搞清楚要解决的问题究竟是什么&#xff0c;要深入、全面的思考。 『产品设计分析之思维整体性』相关题目及解析内容可点击文章末尾…

揭秘偏向锁的升级

今天开始&#xff0c;我会和大家一起深入学习synchronized的原理&#xff0c;原理部分会涉及到两篇&#xff1a; 偏向锁升级到轻量级锁的过程轻量级锁升级到重量级锁的过程 今天我们先来学习偏向锁升级到轻量级锁的过程。因为涉及到大量HotSpot源码&#xff0c;会有单独的一篇…

从钉钉到金蝶云星空通过接口配置打通数据

从钉钉到金蝶云星空通过接口配置打通数据 对接系统钉钉 钉钉&#xff08;DingTalk&#xff09;是阿里巴巴集团打造的企业级智能移动办公平台&#xff0c;是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能…

python | 将pdf文件转换为图片,这一招就够了

一、背景 部分情况下&#xff0c;需要将 PDF 页面转换为图片&#xff0c;例如 PNG 或 JPEG 格式。 python 的开源库 pdfplumber&#xff0c;提供了将 pdf 文件转换为图片的方法。 如果之前还没有安装和使用过pdfplumber库&#xff0c;pdfplumber的安装及基础使用&#xff0c;可…

【React学习】—SetState的使用(九)

【React学习】—SetState的使用&#xff08;九&#xff09; state的简写方式 state属性总结

PCD格式点云文件结构及在线查看工具

本文档描述了 PCD&#xff08;点云数据&#xff09;文件格式及其在点云库&#xff08;PCL&#xff09;中的使用方式。可以使用NSDT 3DConvert 在线预览查看PCD格式的点云数据文件。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 1、为何定义新的点云数据文件格式&#…

【问题总结+备忘录】上传一个shp文件能够读取其中的空间矢量字段,代码+采坑总结

需求描述 要求上传一个shp文件能够读取其中的空间矢量字段。 简单分析 SHP上传格式应该有两种&#xff08;zip格式和.shp的格式文件内部可能存在多个空间矢量&#xff0c;结果以列表形式返回文件不大&#xff0c;使用MultipartFile上传上传即可结合geo-tools读取空间字段&am…

【C++进阶(二)】STL大法--vector的深度剖析以及模拟实现

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; vector 1. 前言2. 熟悉vector的接口函数2.1 vec…

无涯教程-Python机器学习 - Reinforcement Learning函数

这些方法不同于以前研究的方法,也很少使用。在这种学习算法中,我们需要在一段时间内训练一个代理,以便它可以与特定环境交互。代理将遵循一系列与环境进行交互的策略,然后在观察环境之后,它将针对环境的当前状态采取措施。以下是强化学习方法的主要步骤。 第1步-首先,我们需要准…

金鸣表格文字识别软件,让你的图片瞬间变成excel

来百度APP畅享高清图片 首先&#xff0c;让我们打开金鸣表格文字识别软件&#xff01; 然后点击那个“添加文件”的按钮&#xff0c;在弹出的窗口中选择你想要识别的图片&#xff0c;再点击“打开”&#xff0c;就可以把图片添加到待识别的列表中了。 接下来&#xff0c;你只需…

领星ERP和金蝶云星空接口打通对接实战

领星ERP和金蝶云星空接口打通对接实战 对接系统&#xff1a;领星ERP 深圳市领星网络科技有限公司创立于2017年&#xff0c;致力于通过SaaSERP产品为跨境电商行业创造价值&#xff0c;让跨境生意更简单。公司总部位于深圳&#xff0c;在广州、杭州、厦门等设有服务中心。领星现已…

[计算机入门] 账户管理

3.4 账户管理 用户账户是计算机操作系统中用于标识和管理用户身份的概念。 每个用户都拥有一个唯一的用户账户&#xff0c;该账户包含用户的登录名、密码和其他与用户身份相关的信息。 用户账户通常用于验证用户身份&#xff0c;并授权对系统资源的访问权限。在多用户操作系统…

SSL证书申请

DV SSL证书申请需要多久&#xff1f; DV SSL证书无需验证所有者资质资料&#xff0c;审核流程相对简单&#xff0c;因此可快速签发。但部分域名信息可能会触发不同等级的安全审查机制&#xff0c;必要时需要人工介入进行审查签发&#xff0c;因此&#xff0c;SSL证书签发时间可…