Java注解浅析一二

SAP BTP ABAP environment 集成本地系统实践:Cloud Connector、Connectivity service 与隧道通信全解析 摘要: 随着ABAP开发者向云端扩展业务逻辑,如何安全访问企业内网SAP系统成为关键问题。本文基于SAP官方文档,解析通过Cloud Connector和Connectivity service实现云端ABAP环境与本地系统集成的方案。 架构上分为四个角色:ABAP环境、Connectivity服务、Cloud Connector和内网系统。Cloud Connector作为内网出口,通过TLS隧道主动连接云端,避免防火墙开放入站端口。Connectivity服务则作为子账户级“总机”,自动路由请求。 实施 阅读详情

Java注解

注解的作用很神奇,平时@RequestMapping用得6,但是我们还是需要了解其本质和原理。

1. 内置注解

  • 1.1 @Override 重写某个方法
  • 1.2 @Deprecated 标明方法或类过时
  • 1.3 @SuppressWarnings

2. 通过内置注解了解元注解

  • 2.1 @Override
    这个注解可以被用来修饰方法,并且它只在编译时有效.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
  • 2.2 @Deprecated
    这个注解它会被文档化,能够保留到运行时,能够修饰构造方法、属性、局部变量、方法、包、参数、类型。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
  • 2.3 @SuppressWarnings
    它能够修饰的程序元素包括类型、属性、方法、参数、构造器、局部变量,只能存活在源码时,取值为String[]。
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

3. 元注解

元注解是注解的注解。
JDK1.5 提供了4个 @Target,@Retention,@Documented,@Inherited,
JDK 1.8提供了2个 @Repeatable和@Native

3.1 @Target

描述注解的使用范围(即:被修饰的注解可以用在什么地方)
在定义注解类时使用了@Target 能够更加清晰的知道它能够被用来修饰哪些对象,它的取值范围定义在ElementType 枚举中。
@Target注解可以用于修饰 packages、types(类、接口、枚举、注解类)、类成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();
}

ElementType 是枚举类,指定位置包括:

public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,
    FIELD,
    METHOD,
    PARAMETER,
    CONSTRUCTOR,
    LOCAL_VARIABLE,
    ANNOTATION_TYPE,
    PACKAGE,
    TYPE_PARAMETER,
    TYPE_USE
}

3.2 @Retention

描述注解保留的时间范围(即:被描述的注解在它所修饰的类中可以被保留到何时) 。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    /**
     * Returns the retention policy.
     * @return the retention policy
     */
    RetentionPolicy value();
}

RetentionPolicy 枚举定义了保留策略。

public enum RetentionPolicy {
    SOURCE,
    CLASS,
    RUNTIME
}

做一个实验


public class RetentionTest {
    @souceAnnotation
    public void m1(){

    }
    @classAnnotation
    public void m2(){

    }
    @runtimeAnnotation
    public void m3(){

    }

}

@Retention(RetentionPolicy.SOURCE)
@interface souceAnnotation{

}

@Retention(RetentionPolicy.CLASS)
@interface classAnnotation{

}

@Retention(RetentionPolicy.RUNTIME)
@interface runtimeAnnotation{

}

使用javap -verbose RetentionTest查看字节码。发现@souceAnnotation注解在字节码不存在;@classAnnotation、@runtimeAnnotation在字节码存在,状态分别是RuntimeInvisibleAnnotations,RuntimeVisibleAnnotations。
在这里插入图片描述

3.3 @Documented

描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。

3.4 @Inherited

被它修饰的Annotation将具有继承性。如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解。

3.5 @Repeatable (Java8)

允许在同一申明类型(类,属性,或方法)的多次使用同一个注解

3.6 @Native (Java8)

使用 @Native 注解修饰成员变量,则表示这个变量可以被本地代码引用,常常被代码生成工具使用。对于 @Native 注解不常使用.

4.通过发射获取注解内容

4.1 关键方法

AnnotatedElement 接口是所有程序元素(Class、Method和Constructor)的父接口,所以程序通过反射获取了某个类的AnnotatedElement对象之后,程序就可以调用该对象的方法来访问Annotation信息。关键方法如下:

//判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false
boolean isAnnotationPresent(Class<?extends Annotation> annotationClass)

//返回该程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。
<T extends Annotation> T getAnnotation(Class<T> annotationClass)

//返回该程序元素上存在的所有注解
Annotation[] getAnnotations()

//返回该程序元素上存在的、指定类型的注解数组。
<T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass)

//返回直接存在于此元素上的所有注解
<T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass)

//返回直接存在于此元素上的所有注解。
<T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass)

//返回直接存在于此元素上的所有注解及注解对应的重复注解容器。
Annotation[] getDeclaredAnnotations()

4.2 获取注解信息

创建自定义注解SimpleAnnotation

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SimpleAnnotation {
    public String title() default "";
    public String description() default "";
}

在Main类中标记注解

public class Main {

    @Override
    @SimpleAnnotation(title = "toString",description = "override toString")
    public String toString() {
        return "Main{}";
    }

    @Deprecated
    @SimpleAnnotation(title = "oldmethod",description = "do not use it")
    public static void old(){
        System.out.println("old method call ");
    }

    @SuppressWarnings({"unchecked","desc"})
    @SimpleAnnotation(title = "raw method",description = "suppress warning")
    public static void raw(){
        List l1 = new ArrayList<>();
        l1.add("ab");
        old();
    }

    public static void main(String[] args) {
        Method[] methods = Main.class.getMethods();
        for(Method method:methods) {
            if(method.isAnnotationPresent(SimpleAnnotation.class)){
                for(Annotation annotation:method.getDeclaredAnnotations()) {
                    System.out.println("method "+ method.getName() +"() has an annotation : "+ annotation.annotationType()+",title="+method.getAnnotation(SimpleAnnotation.class).title());
                }
            }
        }
    }
}

运行结果:

method toString() has an annotation : interface com.annotation.reflection.SimpleAnnotation,title=toString
method old() has an annotation : interface java.lang.Deprecated,title=oldmethod
method old() has an annotation : interface com.annotation.reflection.SimpleAnnotation,title=oldmethod
method raw() has an annotation : interface com.annotation.reflection.SimpleAnnotation,title=raw method

5 自定义注解

5.1 创建自定义注解类

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyBefore {
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAfter {
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyTest {
}

5.2 创建测试类

public class TestCase01 {
	@MyBefore
	public void init() {
		System.out.println("初始化...");
	}

	@MyAfter
	public void destroy() {
		System.out.println("销毁...");
	}

	@MyTest
	public void testSave() {
		System.out.println("save...");
	}

	@MyTest
	public void testDelete() {
		System.out.println("delete...");
	}
}

5.3 创建框架实现注解类

public class MyJunitFrameWork {
	public static void main(String[] args) throws Exception {
		// 1.先找到测试类的字节码:Test
		Class clazz = TestCase01.class;
		Object obj = clazz.newInstance();
		// 2.获取EmployeeDAOTest类中所有的公共方法
		Method[] methods = clazz.getMethods();
		/* 3.迭代出每一个Method对象 判断哪些方法上使用了@MyBefore/@MyAfter/@MyTest注解
                */
		List<Method> mybeforeList = new ArrayList<>();
		List<Method> myAfterList = new ArrayList<>();
		List<Method> myTestList = new ArrayList<>();
		for (Method method : methods) {
			if(method.isAnnotationPresent(MyBefore.class)){
				//存储使用了@MyBefore注解的方法对象
				mybeforeList.add(method);
			}else if(method.isAnnotationPresent(MyTest.class)){
				//存储使用了@MyTest注解的方法对象
				myTestList.add(method);
			}else if(method.isAnnotationPresent(MyAfter.class)){
				//存储使用了@MyAfter注解的方法对象
				myAfterList.add(method);
			}
		}

		// 执行方法测试
		for (Method testMethod : myTestList) {
			// 先执行@MyBefore的方法
			for (Method beforeMethod : mybeforeList) {
				beforeMethod.invoke(obj);
			}
			// 测试方法
			testMethod.invoke(obj);
			// 最后执行@MyAfter的方法
			for (Method afterMethod : myAfterList) {
				afterMethod.invoke(obj);
			}
		}
	}
}

5.4 运行结果

初始化...
save...
销毁...
初始化...
delete...
销毁...

总结

注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它是框架学习和设计者必须掌握的基础。

java基础 系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/javabasic
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。

STM32 之十三 看门狗(WDG)及低功耗下的处理   最近在做低功耗项目时,遇到了看门狗不好处理的问题。在 ST 的各系列 MCU 中,看门狗应该算是使用配置起来最简单的一个外设了。我们通常仅需要配置很少的配置项,但是,一旦要配合低功耗模式则配置就比较麻烦了。MCU 中有两只狗,一只叫 Independent watchdog (IWDG);另一只叫 System window watchdog (WWDG)。下面是这两只狗的简单介绍! IWDG   IWDG 基本就等同于我们独立使用的看门狗芯片。最适合那些要求看门狗作为一个完全独立的进程在主应用程序之外 阅读详情

相关推荐

要配置西门子G120XA变频器实现**端子启停**和**Modbus RTU(485)频率给定

如有问题,可通过STARTER软件在线诊断Modbus通讯状态。要配置西门子G120AX变频器实现。

微:13763355074 4847

Java 校验注解的使用、自定义校验注解

1)定义自定义校验器,实现接口第一个泛型:注解第二个泛型:修饰的字段类型public class ListValueConstraintValidator implements ConstraintValidator < ListValue , Integer > {/*** 初始化方法,一般用于将自定义注解中的参数缓存* @param constraintAnnotation 参数是自定义的注解} } /**** @param value 传过来的参数。

一名小码农的博客 8843

STM32控制舵机SG-5010转动,HAL库

首先设置时钟为72Mhz,预分频系数为72-1,自动重装载计数器的值为5000-1,这样的话就可以得到一个5ms的脉冲宽度,5000的计数值可以让舵机的旋转角度变得更加易控且相对精准,计算旋转角度的时候也可以更加精确。所以我们5ms脉宽,period是5000脉宽-------------角度----------pulse0.5ms-------------0度----------500;1.0ms------------45度---------1000;

qq_73783264的博客 1293

java基础之注解

注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它是框架学习和设计者必须掌握的基础。 作用: 生成文档,通过代码里标识的元数据生成javadoc文档。 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。 1.java自带的注解 @Override、@Deprecated和

qq_42646178的博客 301

从零理解Brep:用Python玩转3D建模的边界表示法(附OpenCASCADE示例)

本文深入解析了边界表示法(Brep)在3D建模中的应用,通过Python和OpenCASCADE的实战示例,详细介绍了Brep的核心数据结构、布尔运算、网格转换及3D打印优化技巧。适合CAD设计、3D打印和计算机图形学领域的开发者学习与实践。

n4o5p6q7r的博客 427

利用Solidworks2020将挖掘机装配体转换为URDF模型

利用Solidworks2020将挖掘机装配体转换为URDF模型一、下载sw_urdf_exporter插件 URDF(Universal Robot Description Format)——通用机器人描述格式,它是ROS里边使用的一种机器人的描述文件,包含的内容有:连杆、关节,运动学和动力学参数、可视化模型、碰撞检测模型等。 一、下载sw_urdf_exporter插件 ROS提供了SolidWorks转URDF的插件(下载链接)—sw2urdfSetup.exe,下载后点击安装,安装完成后就能在sol

weixin_48192326的博客 6102

Java注解详细讲解

Java注解详细讲解以及自定义应用教程

zzyhappygx的博客 449

Vue3 + OpenLayers 开发指南(一) - 环境搭建与基础配置

本文详细介绍了如何从零开始搭建Vue3与OpenLayers的集成开发环境。通过项目初始化、核心依赖安装、目录结构规划及基础配置,手把手引导开发者创建一个结构清晰、可维护的现代化WebGIS应用骨架,为后续添加地图图层和交互功能奠定坚实基础。

weixin_28049429的博客 339

Java注解一二三

Java注解从了解到使用

明光的博客 1460

外向交货单批次赋值的标准姿势:用 BAPI_OUTB_DELIVERY_CHANGE 把 LIPS-CHARG 改得稳、改得干净

摘要: 外向交货单批次赋值涉及严格的业务约束,包括批次管理状态、单据状态、拆分规则等,直接更新表 LIPS 不可取。推荐使用 BAPI_OUTB_DELIVERY_CHANGE 接口,通过标准业务逻辑实现批次修改。关键点包括:区分单批次分配与批次拆分场景,正确设置 ITEM_CONTROL 控制结构,并确保单位/数量数据完整。附可直接执行的ABAP代码示例,实现安全可靠的批次更新流程。 (字数:149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 397

从误检率30%到99.7%:YOLOv8/v9工业零件缺陷检测实战(附产线部署全流程与参数调优秘籍)

工业场景YOLO实战:从实验室到车间的关键调优策略 本文针对工业缺陷检测的特殊性,系统总结了YOLOv8/v9在工业应用中的实战经验。通过齿轮厂缺陷检测案例,揭示了实验室模型与工业场景的三点本质差异:小目标特性(0.2-1mm缺陷)、复杂背景干扰(油污/反光)和数据量不足问题。重点提出了工业级解决方案:1)数据采集需覆盖极端工况(不同光照/污染/角度);2)标注采用LabelStudio+预标注提升效率;3)定制工业增强策略(反光模拟/缺陷复制粘贴)。文章还提供了完整的参数调优记录和TensorRT加速部署

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1734

Java 注解

文章目录1 简介2 分类2.1 元注解@Target@Retention@Inherited@Repeatable (Java 8)2.2 普通注解3 注解处理器3.1 运行机制3.2 编写处理器3.3 注册处理器4 常用工具5 注意事项6 进阶学习 1 简介 许多 API 都有很多固定套路的代码,比如 Android 里绑定 View 的操作 findViewById(R.id.xxx),添加点...

BillionLeeGogogo 537

innovus:streamOut gds中pg text带有冒号(:)解决办法

streamOut后查看layout,发现部分PG text后面加了冒号,比如VDD: / VSS:。当然,这个问题还有另一种解决办法,就是通过脚本给terminal打text再streamOut。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1190

Java注解Annotation浅析

Java在1.5版本引入注解Annotation,又称Java标注,注解是一种语法元数据,可以被直接使用到源代码中,类/方法/变量/参数/包名等都可以被注解。和Javadoc标签不同,编译器在生成class文件时候能够保留注解代码,同时,可能为了在程序运行过程中(run-time)可以使用注解,Java虚拟机会把注解保留,这样就可以通过反射获取注解Annotation信息

王三的专栏 7270

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java 注解浅析

前言 正文 总结

全力奔跑,梦在彼岸 1203

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java @RestController注解浅析

本文关注重点@RestController 在网上的一番搜索后,我大致总结出了几点: 1.@RestController为开发提供了方便☺,在提供json接口时需要的配置操作再也不需要自己配置了。 2.@RestController注解相当于@ResponseBody和@Controller的结合 @Controller @ResponseBody public class MyControlle...

杨光 2万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java 8中的注解_深入浅析Java8中的类型注解

深入浅析Java8中的类型注解发布时间:2020-11-23 16:37:30来源:亿速云阅读:58作者:Leah这篇文章将为大家详细讲解有关深入浅析Java8中的类型注解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。什么是类型注解在java 8之前,注解只能是在声明的地方所使用,比如类,方法,属性;java 8里面,注解可以应用在任何地方,比如:...

weixin_30135925的博客 603

全面浅析java注解

浅析java注解注解概述注解类写法元注解@Retention(保留范围)@Target(使用范围)@Documented@Inherited@自定义注解支持的类型内置注解应用领域 注解概述 注解(Annotation),是jdk5之后新增一项技术,可以通过在Java类,方法,属性等元素上加上注解,实现一些特定功能:编译检查,丰富文档化注释的内容,实现项目特定程序配置。注解只需要少量代码的存在即可;注释即解释;注解通常不会影响程序的正常逻辑,只是一种标记,Java中的注解通常是给编译器进行识别的 注解类写法

qq_47336023的博客 235

浅析Java中的注解

注解 1. 概念 注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。 注解主要有如下三个作用: 编写文档:通过代码里标识的元数据生成文档,如使用javadoc命令生成文档doc文档 代码分析:通过代码里标识的元数据对代码进行分析,如使用反射 编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查,如@Override 简

Forlogenの解忧杂货铺 548

【Spring注解】java注解浅析

我们IDE编程时经常会自动给我们添加Override、Deprecated等以及三方框架注解,这些注解是怎么定义以及工作的,我们该怎么自定义注解,这些可能是一个入门程序猿所不了解的,本篇文章将对注解进行简单的介绍,希望能给一些对注解有困惑的开发一点帮助。 何为注解 Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法,Annot...

藏经阁 451

Java注解浅析

在开发过程中,我们经常使用各种各样的注解,诸如@Controller、@Service、@Mapper等,是不是有好多码农像我一样机械的复制或者敲几个注解,知道加几个注解有什么样的效果却没有具体的去了解注解?就像我们每天跟隔壁邻居打招呼却不知道他们怎么称呼,是做什么工作的。 一、认识注解 关于注解,我个人理解注解就相当于一个标签,贴在商品上顾客就知道这个商品卖多少钱,打不打折。我们把一个注解放在一...

weixin_40969698的博客 232

java注解深入_深入浅析Java注解框架

深入浅析Java注解框架发布于 2020-3-1|复制链接摘记: 我们经常会在java代码里面看到:“@Override”,“@Target”等等样子的东西,这些是什么?在java里面它们是“注解”。下面是百度百科的解释:java.lang.annotation.Retention可以在您定义Annotation型态时,指示编译器如何对待您的自定义 Annotation,预设上编译器会将Annot...

weixin_39850331的博客 99

浅析Java注解

浅析Java注解 这几天需要使用自定义注解,发现很不熟练,写此笔记总结 参考慕课网教程。 JDK1.8

slgxmh的博客 552

java内建注解及源码浅析

java内建注解及源码浅析首先,先看java.lang下的4个annoation类型。如图所示: 1.Override1.1 源码 表明在类中需要覆盖重写超类中声明的方法。如果这个方法注解了该annotation类型,但是没有重写超类的方法,编译将器会报错。 @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) publi

JunliXia的博客 737

注解浅析

注解是JDK5的新特性,是一种特殊的类,它作用相当于一个注释和标记,它可以应用于包,类(类,接口,枚举和注释类型),变量(类,实例和局部变量 - 包括在for或while循环中定义的变量),构造函数,方法和参数。注解的使用减少了大量配置文件的使用,使代码更加易读。 注解是一个特殊的接口,使用@interface定义注释类型,注解中元素值允许基础类型,字符串,枚举,Class和它们的数组。元素使用...

Yheaw的博客 695

java 注解 框架_深入浅析Java注解框架

我们经常会在java代码里面看到:“@Override”,“@Target”等等样子的东西,这些是什么?在java里面它们是“注解”。下面是百度百科的解释:java.lang.annotation.Retention可以在您定义Annotation型态时,指示编译器如何对待您的自定义 Annotation,预设上编译器会将Annotation资讯留在class档案中,但不被虚拟机器读取,而仅用于编...

weixin_39837867的博客 168
上一篇: Java泛型浅析一二
下一篇: Java异常浅析一二
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值