精华内容
下载资源
问答
  • [ 用大白话讲解复杂的技术 ]这是我的第41篇原创文章作者 l 会点代码的大叔(CodeDaShu)今天,我们来聊聊 Java注解。01注解的概念Annotation(注解):先看看官方给出的概念,注解Java 提供的一种对元程序中元素...

    [ 用大白话讲解复杂的技术 ]

    这是我的第41篇原创文章

    作者 l 会点代码的大叔(CodeDaShu)

    今天,我们来聊聊 Java 的注解。

    01

    注解的概念

    Annotation(注解):先看看官方给出的概念,注解是 Java 提供的一种对元程序中元素关联信息和元数据的途径和方法;这种解释让人看的一脸懵,通俗一点说,可以把注解看做是对人对物的标签,比如:

    凶猛的狮子,温顺的兔子,木讷的程序员,帅气的大叔;这里的“凶猛”、“温顺”、“木讷”、“帅气”就是对各个事物的标签;

    注解也是一种标签,是对 Java 代码的一种标签,可以告诉程序员被注解的代码是用来做什么的;

    当然标签的内容可能跟实际情况有所出入,甚至背道而驰,比如【木讷的程序员】,实际上就是一个很差的标签,所以如果你在 Contrller 层的代码添加了一个 Service 的注解,同样也是一个很差的标签。

    02

    元注解

    元注解是注解的注解,也就是对标签的描述。比如“木讷”、“帅气”只能用在人或动物身上,那么“只能用在人或动物身上”就是对“木讷”、“帅气”这两个标签的标签;恰好元注解中就有 @Target,表示修饰对象的范围,让我们详细看一下元注解都有哪些。

    @Target:表示修饰对象的范围,注解可以作用于 packages、class、interface、方法、成员变量、枚举、方法入参等等,@Target可以指明该注解可以修饰哪些内容。

    @Retention:时间长短,也就是注解在什么时间范围之内有效,比如在源码中有效,在 class 文件中有效,在 Runtime 运行时有效。

    @Documented:表示可以被文档化,比如可以被 javadoc 或类似的工具生成文档。

    @Inherited:表示这个注解会被继承,比如 @MyAnnotation 被 @Inherited 修饰,那么当 @MyAnnotation 作用于一个 class 时,这个 class 的子类也会被 @MyAnnotation 作用。

    03

    内置注解

    Java 中最早内置了三种注解:

    @Override:检查该方法是否是重载方法;如果父类或实现的接口中,如果没有该方法,编译会报错。

    @Deprecated:已经过时的方法;如果使用该方法,会有警告提醒。

    @SuppressWarnings:忽略警告;比如使用了一个过时的方法会有警告提醒,可以为调用的方法增加 @SuppressWarnings 注解,这样编译器不在产生警告。

    JDK 7之后,又增加了三种:

    @SafeVarargs:是一个参数安全类型注解,作用是告诉开发人员,参数可能会存在不安全的操作,要多注意一些;它会产生一个 unchecked 的警告;@SafeVarargs 注解只能用在可变长度参数的方法上,并且这个方法必须是 static 或 final 的,否则会出现编译错误。

    @FunctionalInterface:表示是只有一个方法的接口,JDK 8 引入。

    @Repeatable:表示注解的值可以有多个,比如我又帅气又幽默,这时候我同时有了“帅气”和“幽默”两个标签。

    04

    注解的使用场景

    注解可以让编译器探测错误和警告;编译阶段可以利用注解生成文档、代码或做其他的处理;在代码运行阶段,一些注解还可以帮助完成代码提取之类的工作。

    比如,使用过 Spring 框架的同学应该对 @Autowired 很熟悉了。使用 Spring 开发时,进行配置可以用 xml 配置文件的方式,现在用的更多的就是注解的方式。@Autowired 可以帮助我们注入一个定义好的 Bean。

    @Autowired 的核心代码大概是这样的,作用就是 Spring 可以提取到使用 @Autowired 修饰的字段或方法做注入:

    期待分享

    如果您喜欢本文,请点个“在看”或分享到朋友圈,这将是对我最大的鼓励。

    展开全文
  • 原标题:Java常用类与方法注解 前言学习Java的小伙伴们,相信有一部分对于Java常用类与方法的掌握并不是很理想,在这里小编帮助各位小伙伴们将这类知识在巩固一下。正文@Target表示注解能放在什么位置上ElementType....

    原标题:Java常用类与方法注解

    472d9149e0e65b0d5d73f282767318d4.png

    前言

    学习Java的小伙伴们,相信有一部分对于Java常用类与方法的掌握并不是很理想,在这里小编帮助各位小伙伴们将这类知识在巩固一下。

    正文

    @Target表示注解能放在什么位置上

    ElementType.TYPE:能修饰类、接口或枚举类型

    ElementType.FIELD:能修饰成员变量

    ElementType.METHOD:能修饰方法

    ElementType.PARAMETER:能修饰参数

    ElementType.CONSTRUCTOR:能修饰构造器

    ElementType.LOCAL_VARIABLE:能修饰局部变量

    ElementType.ANNOTATION_TYPE:能修饰注解

    ElementType.PACKAGE:能修饰包

    @Retention 表示生命周期,自定义注解@JDBCConfig 上的值是 RetentionPolicy.RUNTIME, 表示可以在运行的时候依然可以使用。 @Retention可选的值有3个:

    RetentionPolicy.SOURCE: 注解只在源代码中存在,编译成class之后,就没了。@Override 就是这种注解。

    RetentionPolicy.CLASS: 注解在java文件编程成.class文件后,依然存在,但是运行起来后就没了。@Retention的默认值,即当没有显式指定@Retention的时候,就会是这种类型。

    RetentionPolicy.RUNTIME: 注解在运行起来之后依然存在,程序可以通过反射获取这些信息,自定义注解@JDBCConfig 就是这样。

    @Inherited 表示该注解具有继承性。

    @Documented

    在用javadoc命令生成API文档后,该类的文档里会出现该注解说明。

    @Repeatable 在一个类中可重复的使用一个注解(需要其他注解制定)

    @Target( METHOD)

    @Retention( RetentionPolicy.RUNTIME )

    public @interface FileTypes {

    FileType[] value();

    }

    @Target( METHOD )

    @Retention( RetentionPolicy.RUNTIME )

    @Repeatable( FileTypes.class )

    public @interface FileType {

    String value();

    责任编辑:

    展开全文
  • package ...import java.lang.annotation.Documented;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;@Retentio...

    package com.what21.jdk15.demo02;

    import java.lang.annotation.Documented;

    import java.lang.annotation.Inherited;

    import java.lang.annotation.Retention;

    import java.lang.annotation.RetentionPolicy;

    @Retention(RetentionPolicy.RUNTIME)

    @Documented

    @Inherited

    public @interface Property {

    /**

    * 默认值为""

    *

    * @return

    */

    String name() default "";

    /**

    * 默认值为""

    *

    * @return

    */

    String value() default "";

    }

    package com.what21.jdk15.demo02;

    import java.lang.annotation.Annotation;

    @Property(name = "class")

    public class AnnotationDemo {

    @Property(name = "field", value = "test")

    public String test;

    @Property(name = "method", value = "test")

    public static void test() {

    System.out.println("test()");

    }

    /**

    * @param args

    * @throws Exception

    */

    public static void main(String[] args) throws Exception {

    // ========获取类的注解========

    Annotation classAno = AnnotationDemo.class

    .getAnnotation(Property.class);

    System.out.println(classAno);

    // ========获取字段的注解========

    Annotation fieldAno = AnnotationDemo.class.getField("test")

    .getAnnotation(Property.class);

    System.out.println(fieldAno);

    // ========获取方法的注解========

    Annotation methodAno = AnnotationDemo.class.getMethod("test")

    .getAnnotation(Property.class);

    System.out.println(methodAno);

    }

    }

    展开全文
  • java 注解 id_java注解

    2021-03-09 20:44:27
    java注解:Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。注解理解的前提:我认为注解就是...

    java注解:

    Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。

    注解理解的前提:

    我认为注解就是标签

    它是在 Java SE 5.0 版本中开始引入的概念,就如同java中的 class和interface

    说到这个就不得不说注解中的基础元注解

    元注解: 元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。

    如果不理解,可以这么认为:元注解也是一张标签,但是它是一张特殊的标签,它的作用和目的就是给其他普通的标签进行解释说明的。

    元标签有 @Retention、@Documented、@Target、@Inherited、@Repeatable 5 种。

    @Retention

    Retention 的英文意为保留期的意思。当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的的存活时间。

    它的取值如下:

    RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。

    RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。

    RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。

    我们可以这样的方式来加深理解,@Retention 去给一张标签解释的时候,它指定了这张标签张贴的时间。@Retention 相当于给一张标签上面盖了一张时间戳,时间戳指明了标签张贴的时间周期。

    @Retention(RetentionPolicy.RUNTIME)public @interfaceTestAnnotation {

    }

    @Documented

    顾名思义,这个元注解肯定是和文档有关。它的作用是能够将注解中的元素包含到 Javadoc 中去。

    @Target

    Target 是目标的意思,@Target 指定了注解运用的地方。

    你可以这样理解,当一个注解被 @Target 注解时,这个注解就被限定了运用的场景。

    类比到标签,原本标签是你想张贴到哪个地方就到哪个地方,但是因为 @Target 的存在,它张贴的地方就非常具体了,比如只能张贴到方法上、类上、方法参数上等等。@Target 有下面的取值

    ElementType.ANNOTATION_TYPE 可以给一个注解进行注解

    ElementType.CONSTRUCTOR 可以给构造方法进行注解

    ElementType.FIELD 可以给属性进行注解

    ElementType.LOCAL_VARIABLE 可以给局部变量进行注解

    ElementType.METHOD 可以给方法进行注解

    ElementType.PACKAGE 可以给一个包进行注解

    ElementType.PARAMETER 可以给一个方法内的参数进行注解

    ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举

    @Inherited

    Inherited 是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。

    说的比较抽象。代码来解释。

    @Inherited

    @Retention(RetentionPolicy.RUNTIME)

    @interface Test {}

    @Test

    public class A {}

    public class B extends A {}

    注解 Test 被 @Inherited 修饰,之后类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解。

    @Repeatable

    Repeatable 自然是可重复的意思。@Repeatable 是 Java 1.8 才加进来的,所以算是一个新的特性。

    什么样的注解会多次应用呢?通常是注解的值可以同时取多个。

    @interface Persons {

    Person[] value();

    }

    @Repeatable(Persons.class)

    @interface Person{

    String role() default "";

    }

    @Person(role="artist")

    @Person(role="coder")

    @Person(role="PM")

    public class SuperMan{

    }

    注意上面的代码,@Repeatable 注解了 Person。而 @Repeatable 后面括号中的类相当于一个容器注解。

    什么是容器注解呢?就是用来存放其它注解的地方。它本身也是一个注解。

    @interface Persons {

    Person[] value();

    }

    按照规定,它里面必须要有一个 value 的属性,属性类型是一个被 @Repeatable 注解过的注解数组,注意它是数组。

    如果不好理解的话,可以这样理解。Persons 是一张总的标签,上面贴满了 Person 这种同类型但内容不一样的标签。把 Persons 给一个 SuperMan 贴上,相当于同时给他贴了程序员、产品经理、画家的标签。

    我们可能对于 @Person(role=”PM”) 括号里面的内容感兴趣,它其实就是给 Person 这个注解的 role 属性赋值为 PM ,大家不明白正常,马上就讲到注解的属性这一块。

    注解的属性

    注解的属性也叫做成员变量。注解只有成员变量,没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。

    @Target(ElementType.TYPE)

    @Retention(RetentionPolicy.RUNTIME)public @interfaceTestAnnotation {intid();

    String msg();

    }

    上面代码定义了 TestAnnotation 这个注解中拥有 id 和 msg 两个属性。在使用的时候,我们应该给它们进行赋值。

    赋值的方式是在注解的括号内以 value=”” 形式,多个属性之前用 ,隔开。

    需要注意的是,在注解中定义属性时它的类型必须是 8 种基本数据类型外加 类、接口、注解及它们的数组。

    注解中属性可以有默认值,默认值需要用 default 关键值指定。比如:

    @Target(ElementType.TYPE)

    @Retention(RetentionPolicy.RUNTIME)public @interfaceTestAnnotation {public int id() default -1;public String msg() default "Hi";

    }

    TestAnnotation 中 id 属性默认值为 -1,msg 属性默认值为 Hi。

    它可以这样应用。

    @TestAnnotation()

    public class Test {}

    因为有默认值,所以无需要再在 @TestAnnotation 后面的括号里面进行赋值了,这一步可以省略。

    最后,还需要注意的一种情况是一个注解没有任何属性。比如

    public @interface Perform {}

    那么在应用这个注解的时候,括号都可以省略。

    java 预置的注解

    学习了上面相关的知识,我们已经可以自己定义一个注解了。其实 Java 语言本身已经提供了几个现成的注解。

    @Override

    这个大家应该很熟悉了,提示子类要复写父类中被 @Override 修饰的方法

    @SuppressWarnings

    阻止警告的意思。之前说过调用被 @Deprecated 注解的方法后,编译器会警告提醒,而有时候开发者会忽略这种警告,他们可以在调用的地方通过 @SuppressWarnings 达到目的。

    @SuppressWarnings("deprecation")public voidtest1(){

    Hero hero= newHero();

    hero.say();

    hero.speak();

    }

    还有一些就不一一列举了

    自定义注解

    自定义注解可以理解为:注解自己的注解

    建造自己的注解

    1 importjava.lang.annotation.RetentionPolicy;2

    3 @Retention(RetentionPolicy.RUNTIME)4 public @interfaceExecute {5

    6 }

    用它注解一些方法

    1 public classdatr {2 @Execute3 public voidd(){4 System.out.println("dddd");5 }6 @Execute7 public voida(){8 System.out.println("aaaa");9 }10 @Execute11 public voidb(){12 System.out.println("bbbb");13 }14 @Execute15 public voidc(){16 System.out.println("cccc");17 }18 @Execute19 public voide(){20 System.out.println("eeee");21 }22 }

    使用Test类测试调用方法

    importjava.lang.reflect.Method;public classTest {public static void main(String[] args) throwsException {

    Class a= Class.forName("com.accp.entity.datr");

    datr o=(datr) a.getConstructor().newInstance();for(Method arg : a.getDeclaredMethods()) {if (arg.isAnnotationPresent(Execute.class)){

    arg.invoke(o);

    }

    }

    }

    }

    注解与反射。

    注解通过反射获取。首先可以通过 Class 对象的 isAnnotationPresent() 方法判断它是否应用了某个注解

    public boolean isAnnotationPresent(Class extends Annotation> annotationClass) {}

    然后通过 getAnnotation() 方法来获取 Annotation 对象。

    public A getAnnotation(Class annotationClass) {}

    或者是 getAnnotations() 方法。

    public Annotation[] getAnnotations() {}

    前一种方法返回指定类型的注解,后一种方法返回注解到这个元素上的所有注解。

    如果获取到的 Annotation 如果不为 null,则就可以调用它们的属性方法了。

    1 @TestAnnotation()2 public classTest {3 public static voidmain(String[] args) {4 boolean hasAnnotation = Test.class.isAnnotationPresent(TestAnnotation.class);5 if( hasAnnotation ) {6 TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class);7 System.out.println("id:"+testAnnotation.id());8 System.out.println("msg:"+testAnnotation.msg());9 }10 }11 }

    程序的运行结果是:

    1 id:-1

    2 msg:

    这个正是 TestAnnotation 中 id 和 msg 的默认值。

    需要注意的是,如果一个注解要在运行时被成功提取,那么 @Retention(RetentionPolicy.RUNTIME) 是必须的。

    注解应用实例

    注解运用的地方太多了,如:

    JUnit 这个是一个测试框架,典型使用方法如下:

    1 public classExampleUnitTest {2 @Test3 public void addition_isCorrect() throwsException {4 assertEquals(4, 2 + 2);5 }6 }

    还有例如ssm框架等运用了大量的注解。

    总结

    如果注解难于理解,你就把它类同于标签,标签为了解释事物,注解为了解释代码。

    注解的基本语法,创建如同接口,但是多了个 @ 符号。

    注解的元注解。

    注解的属性。

    注解主要给编译器及工具类型的软件用的。

    注解的提取需要借助于 Java 的反射技术,反射比较慢,所以注解使用时也需要谨慎计较时间成本。

    展开全文
  • 本篇文章帮大家学习java注解类型,包含了Java注解类型使用方法、操作技巧、实例演示和注意事项,有一定的学习价值,大家可以用来参考。标记注解类型标记注解类型是没有元素的注解类型,甚至没有默认值。标记注解由...
  • java注解编程_Java注解

    2021-03-01 09:17:28
    Java注解Annotation元注解@Retention保留期,当@Retention应用到一个注解上,说明了这个注解的存活时间。RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视RetentionPolicy.CLASS ...
  • java注解 简书_Java注解

    2021-03-12 10:08:14
    Java注解Annotation,注解,可理解为对代码贴上的标签。注解的定义: 跟接口类似,只是多了一个@符号public @interface TestAnnotation {}注解的使用:@TestAnnotationpublic class Test {}元注解,或者元标签有 @...
  • 该文章讲解了如何处理源码注解(CLASS ),是继Java注解解析-基础+运行时注解(RUNTIME)之,使用注解处理器处理CLASS注解的文章。通过完整的Demo例子介绍整个注解处理器的搭建流程以及注意事项,你将知道如何去搭建自己...
  • Ⅰ 什么是注解Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类...
  • java注解工具_Java注解

    2021-03-15 17:40:57
    注解是放在Java源码的类、方法、字段、参数前的一种特殊“注释”:// this is a component:@Resource("hello")public class Hello {@Injectint n;@PostConstructpublic void hello(@Param Str...
  • java注解概念Java提供了一种原程序中的元素关联任何信息和任何数据的途径和方法java注解介绍常用注解@Override:表示方法是重写的方法@Deprecated:过时的方法@SuppressWarnings:抑制警告注解分类按照运行机制分1、...
  • Java 注解

    2020-09-07 17:48:24
    日常开发中新建Java类,我们使用class、interface比较多,而注解和它们一样,也是一种类的类型,他是用的修饰符为 @interface 。 1、注解基础知识 注解的定义 **注释:**文字描述介绍程序,提供给程序员查看的帮助...
  • java注解

    2019-07-10 17:46:00
    java注解: Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。 注解理解的前提:知道什么是...
  • Java注解

    2020-04-16 23:48:50
    Java注解初步 文章目录Java注解初步1、注解介绍1.1 注解作用1.2 常用Java内置注解1.3注解分类2、元注解2.1概述--注解的注解2.2常用元注解3、自定义注解 1、注解介绍 注解Annotation,JDK5.0之后引入的特性。 用于...
  • Java程序中通过注解...一、注解的分类1、按照运行机制分为源码注解、编译注解和运行时注解(1)源码注解注解只在源码中存在,编译成.class文件就不存在了(2)编译注解注解在源码和.class文件中都存在,如JDK的三...
  • Java注解(Annotation)0.0 Hello World先上代码,再加以说明。这样不至于让初学者懵。例1public class Dog extends Animal(){@Overridepublic void call(){System.out.println("汪汪...");}}0.1 Java自带注解 - @...
  • Java 注解的使用注解的使用非常简单,只需在需要注解的地方标明某个注解即可,例如在方法上注解:public class Test {@Overridepublic String tostring() {return "override it";}}例如在类上注解:@...
  • public @interface Marker {}@Markerpublic class Main{}元注解类型元注解类型是注解类型,用于注解其他注解类型。元注解类型是Java类库的一部分。它们在包java.lang.annotation中声明。以下注解类型是元注解类型:...
  • 注解的分类按照运行机制分源码注解注解只在源码中存在,编译成 .class 文件就不存在了编译时注解注解在源码和 .class 文件中都存在运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解按照来源分来自JDK...
  • 和Javadoc标签不同,编译器在生成class文件时候能够保留注解代码,同时,可能为了在程序运行过程中(run-time)可以使用注解Java虚拟机会把注解保留,这样就可以通过反射获取注解Annotation的相关信息。内置注解其实...
  • 一、认识注解1、注解的定义:java提供了一种原程序中的...3、java注解分类(按照运行机制分)(1)源码注解:注解只有在源码中存在,编译成.class文件就不存在了。(2)编译时注解:注解在源码和.class文件中都存在(3)运...
  • 注解的定义日常开发中新建Java类,我们使用class、interface比较多,而注解和它们一样,也是一种类的类型,他是用的修饰符为 @interface注解类的写法我们新建一个注解MyTestAnnotationpublic @...
  • 注解@Documented 注解是否将包含在JavaDoc中@Inherited 被注解类的子类是否会注解@Retention 注解保留位置@Target 注解的范围@...分别对应注解的保留位置为.java源码、.class代码和字节码。SOURCE类型的注解只...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,970
精华内容 3,188
关键字:

java注解class

java 订阅