注解

JDK自带的注解三个

  1. @Override: 限定重写父类方法, 实现接口方法。该注解只能用于方法
  2. @Deprecated: 用于表示所修饰的元素(类, 方法,构造器等等)已过时。通常是因为所修饰的结构危险或存在更好的选择,过时是可以用的,意义只是作为一种提示,因为原来的项目中用的老的代码必须要能用,过时是给我们后面做开发的提示
  3. @SuppressWarnings: 抑制编译器警告

example

@SuppressWarnings({"unused","rawtypes"})

注解分类

按照运行机制

  1. 源码注解

    注解只在源码中存在,编译成class文件就不存在了
  2. 编译时注解

    注解在源码和class文件里都存在(jdk自带注解)

    3.运行时注解

    在运行阶段起作用。影响逻辑的注解,比如@Autowired

按照来源分类

  1. 来及JDK的注解,
  2. 来自第三方的注解
  3. 自己定义的注解

自定义注解的语法要求

1、使用@interface关键字定义注解

2、成员以无参无异方式声明

3、可以defaulit为成员指定一个默认值

4、成员的类型是受限制的,合法的类型包括原始类型,以及String,Class,Annotation,Enumeration

5、如果注解只有成员,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号

6、注解类可以没有成员,没有成员的注解称为标识注解



元注解

  1. Retention

    决定注解的运行时机,编译时,运行时和源码注解
  2. Target

    注解的使用对象
  3. Inherited

    被使用了注解的父类,子类是否被继承
  4. Document

    是否生成文档







解析注解

概念:通过反射获取类、函数或成员上的运行时注解信息,从而实现动态控制运行的逻辑。


/**
* 自定义注解
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface AnnoTest {
String value() default "AnnoTest";
} /**
* 测试类
*/
@AnnoTest("this is class")
public class Person {
@AnnoTest("this is method")
public void test() { }
} /**
* 解析注解
*/
public class Main {
public static void main(String[] args) {
try {
//通过反射获取类
Class c = Class.forName("anno.Son");
//判断是否在类上包含注解
boolean b = c.isAnnotationPresent(AnnoTest.class);
if (b) {
AnnoTest annotation = (AnnoTest) c.getAnnotation(AnnoTest.class);
System.out.println(annotation.value());
}
//获取所有方法
Method[] methods = c.getMethods();
for (Method method : methods) {
//判断在方法上是否包含注解
boolean b1 = method.isAnnotationPresent(AnnoTest.class);
if (b1) {
AnnoTest annotation = method.getAnnotation(AnnoTest.class);
System.out.println(annotation.value());
}
} } catch (Exception e) {
e.printStackTrace();
}
}
}
获取注解的注解

https://segmentfault.com/q/1010000018911081

Spring中的注解

组合注解

springboot中@SpringBootApplication,一个注解包括了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解。


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class
)
Class<?>[] exclude() default {}; @AliasFor(
annotation = EnableAutoConfiguration.class
)
String[] excludeName() default {}; @AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {}; @AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {}; @AliasFor(
annotation = ComponentScan.class,
attribute = "nameGenerator"
)
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class; @AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
通过@AliasFor实现,@AliasFor是让字段具备父类的功能。
~~~java @Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface AliasFor {
@AliasFor("attribute")
String value() default ""; @AliasFor("value")
String attribute() default ""; Class<? extends Annotation> annotation() default Annotation.class;
}
> Class<? extends Annotation> annotation() default Annotation.class;
这里annotation字段即是继承的class。

java 注解开发的更多相关文章

  1. Java注解开发与应用案例

    Java注解开发与应用案例 Annotation(注解)是JDK5.0及以后版本引入的,可以对包.类.属性.方法的描述,给被述对象打上标签,被打上标签后的类.属性.方法将被赋予特殊的“功能”:打个比喻 ...

  2. 使用Java注解开发自动生成SQL

    使用注解开发的好处就是减少配置文件的使用.在实际过程中,随着项目越来越复杂,功能越来越多,会产生非常多的配置文件.但是,当配置文件过多,实际维护过程中产生的问题就不容易定位,这样就会徒劳的增加工作量. ...

  3. 干掉前端!3分钟纯 Java 注解搭个管理系统

    大家好,我是小富~ 最近接触到个新项目,发现它用了一个比较有意思的框架,可以说实现了我刚入行时候的梦想,所以这里马不停蹄的和大家分享下. 在我刚开始工作接触的项目都还没做前后端分离,经常需要后端来维护 ...

  4. Java自定义注解开发

    一.背景 最近在自己搞一个项目时,遇到可需要开发自定义注解的需求,对于没有怎么关注这些java新特性的来说,比较尴尬,索性就拿出一些时间,来进行研究下自定义注解开发的步骤以及使用方式.今天在这里记下, ...

  5. Java实现自定义注解开发

    Java实现自定义注解开发 一直都对注解开发挺好奇的,最近终于有时间自己实践了一把,记录一下 万一后期会用到呢 哈哈哈 首先我们了解一下自定义注解的标准示例,注解类使用 @interface 关键字修 ...

  6. 【java框架】MyBatis(7)--MyBatis注解开发

    1.MyBatis注解开发 1.1.Lombok的基本使用 Lombok是SpringBoot2.1.X版本与IDEA官方支持的一个插件,它是为简化POJO类中繁杂重复代码:geter/setter/ ...

  7. bean的自动装配,使用注解开发,使用java的方式配置Spring

    bean的自动装配 自动装配是Spring满足bean依赖一种方式! Spring会在上下文中自动寻找,并自动给bean装配属性! 在Spring中有三种装配的方式 在xml中显示的配置 在java中 ...

  8. Java开发学习(十)----基于注解开发定义bean 已完成

    一.环境准备 先来准备下环境: 创建一个Maven项目 pom.xml添加Spring的依赖 <dependencies>    <dependency>        < ...

  9. Spring使用注解开发及使用java类进行配置bean

    Spring使用注解开发 说明 在spring4之后,想要使用注解形式,必须得要引入aop的包 在配置文件当中,还得要引入一个context约束 <?xml version="1.0& ...

随机推荐

  1. Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树

    Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树 目录 Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树 0x00 摘要 0x01 背景概念 1.1 词向量基础 ...

  2. GitHub 热点速览 Vol.31:在?跑个 GitHub 评分如何?

    摘要:个性化的 GitHub README 自从 7 月上线之后一直风靡在各大技术平台,当中最有意思的莫过于代表你技术的 GitHub Readme Stats 了,除了能显示你提交的 pr.comm ...

  3. elasticsearch技术解析与实战ES

    elasticsearch技术解析与实战ES 下载地址: https://pan.baidu.com/s/1NpPX05C0xKx_w9gBYaMJ5w 扫码下面二维码关注公众号回复100008 获取 ...

  4. 数据结构进阶:ST表

    简介 ST 表是用于解决 可重复贡献问题 的数据结构. 什么是可重复贡献问题? ​ 可重复贡献问题 是指对于运算 \(\operatorname{opt}\) ,满足 \(x\operatorname ...

  5. PHP基础之排序

    前言 之前简单介绍了流程控制,函数,数组等.有兴趣的可以看看. PHP入门之类型与运算符 PHP入门之流程控制 PHP入门之函数 PHP入门之数组 接下来介绍一下排序,排序是将一组数据,依指定的顺序进 ...

  6. three.js 着色器材质之变量(三)

    这篇郭先生在练习一下着色器变量,在度娘上面或者官网上经常看到类似水波一样的效果,这篇就试着做一个这样的效果,顺便巩固一下顶点着色器和片元着色器,毕竟多多练习才能更好地掌握.效果如下图,在线案例请点击博 ...

  7. 【学习笔记】VS Code的launch.json 的 Python和Chrome常用配置(MacOS)

    遇到的问题: 1.无法直接用VS Code调用Chrome来打开HTML文件 2.VS Code调用Chrome成功后,Python解释器无法启动调试了 解决方法: 以下是我的 launch.json ...

  8. Java进阶知识

    01[Object类.常用API] 主要内容 Object类 Date类 DateFormat类 Calendar类 System类 StringBuilder类 包装类 第一章 Object类 1. ...

  9. C#LeetCode刷题之#118-杨辉三角(Pascal‘s Triangle)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3688 访问. 给定一个非负整数 numRows,生成杨辉三角的前 ...

  10. Mybatis-05-使用注解开发

    使用注解开发 1 面向接口编程 原因: 解耦.可扩展性.提高复用性 关于接口的理解 定义与实现的分离 两类接口 一个个体的抽象,abstract class 一个个体某个方面的抽象,interface ...