首页 > 编程语言 >Java官方笔记10注解

Java官方笔记10注解

时间:2023-06-17 15:23:41浏览次数:50  
标签:applied 10 Java Schedule class 注解 ElementType annotation

注解

注解的作用:

  • Information for the compiler — Annotations can be used by the compiler to detect errors or suppress warnings.
  • Compile-time and deployment-time processing — Software tools can process annotation information to generate code, XML files, and so forth.
  • Runtime processing — Some annotations are available to be examined at runtime.

注解格式,使用@

@Entity

带key-value:

@Author(
   name = "Benjamin Franklin",
   date = "3/27/2003"
)
class MyClass { ... }

只有1个key时可以省略key:

@SuppressWarnings(value = "unchecked")
void myMethod() { ... }
@SuppressWarnings("unchecked")
void myMethod() { ... }

同时使用多个注解:

@Author(name = "Jane Doe")
@EBook
class MyClass { ... }

The annotation type can be one of the types that are defined in the java.lang or java.lang.annotation packages of the Java SE API.

哪里能用注解

① Annotations can be applied to declarations: declarations of classes, fields, methods, and other program elements.

② Java SE 8,annotations can also be applied to the use of types

  • Class instance creation expression:

    new @Interned MyObject();
    
  • Type cast:

    myString = (@NonNull String) str;
    
  • implements clause:

    class UnmodifiableList<T> implements
      @Readonly List<@Readonly T> { ... }
    
  • Thrown exception declaration:

    void monitorTemperature() throws
      @Critical TemperatureException { ... }
    

自定义注解

使用@interface

@interface ClassPreamble {
   String author();
   String date();
   int currentRevision() default 1;
   String lastModified() default "N/A";
   String lastModifiedBy() default "N/A";
   // Note use of array
   String[] reviewers();
}

注解其实也是一种接口,只是要使用@来声明。

使用:

@ClassPreamble (
   author = "John Doe",
   date = "3/17/2002",
   currentRevision = 6,
   lastModified = "4/12/2004",
   lastModifiedBy = "Jane Doe",
   // Note array notation
   reviewers = {"Alice", "Bob", "Cindy"}
)
public class Generation3List extends Generation2List {

// class code goes here

}

Java预置注解

@Deprecated

// Javadoc comment follows
/**
 * @deprecated
 * explanation of why it was deprecated
 */
@Deprecated
static void deprecatedMethod() { }

@Override

// mark method as a superclass method
// that has been overridden
@Override 
int overriddenMethod() { }

@SuppressWarnings

// use a deprecated method and tell 
// compiler not to generate a warning
@SuppressWarnings("deprecation")
void useDeprecatedMethod() {
    // deprecation warning
    // - suppressed
    objectOne.deprecatedMethod();
}

@SafeVarargs

@FunctionalInterface

注解上的注解:Annotations that apply to other annotations are called meta-annotations. There are several meta-annotation types defined in java.lang.annotation.

@Retention

  • RetentionPolicy.SOURCE – The marked annotation is retained only in the source level and is ignored by the compiler.
  • RetentionPolicy.CLASS – The marked annotation is retained by the compiler at compile time, but is ignored by the Java Virtual Machine (JVM).
  • RetentionPolicy.RUNTIME – The marked annotation is retained by the JVM so it can be used by the runtime environment.

@Documented

@Target

@Inherited

@Repeatable

重复注解也是允许的:

@Schedule(dayOfMonth="last")
@Schedule(dayOfWeek="Fri", hour="23")
public void doPeriodicCleanup() { ... }

重复注解的定义要用到@Repeatable:

@Repeatable(Schedules.class)
public @interface Schedule {
  String dayOfMonth() default "first";
  String dayOfWeek() default "Mon";
  int hour() default 12;
}

并且,The containing annotation type must have a value element with an array type:

public @interface Schedules {
    Schedule[] value();
}

the containing annotation type is @Schedules, so repeating @Schedule annotations is stored in an @Schedules annotation.

Schedule[] value()是一个没有参数、返回类型为Schedule[]的方法的声明,它是一个抽象方法。事实上,这个方法声明是用来定义注解的属性的,与普通方法不同的是,它没有方法体,只有方法声明,而方法的具体实现则由使用该注解的代码来完成。在使用该注解时,也可以通过指定该属性的值来进行赋值操作,例如:

@Schedules({
        @Schedule(dayOfMonth="last"),
        @Schedule(dayOfWeek="Fri", hour="23")
})
public class MyScheduledTask {
    // ...
}

在上述代码中,我们使用了@Schedules注解,并且指定了它的value属性,也就是给Schedule[] value()方法赋上相应的值。注意到,该属性的值是一个注解数组,因此需要使用大括号{}将多个注解组合起来。

参考资料:

Annotations https://dev.java/learn/annotations/

标签:applied,10,Java,Schedule,class,注解,ElementType,annotation
From: https://www.cnblogs.com/df888/p/17487497.html

相关文章

  • Java流程控制05:Switch选择结构
    多选择结构还有一个实现方式就是switchcase语句。switchcase语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。switch(exception){casevalue://语句break;//可选casevalue:......
  • Java官方笔记9Lambda表达式
    LambdaExpression有了LambdaExpression,就不用再写anonymousclasses。写Lambda,首先要找到它的类型。Thereisarestrictiononthetypeofalambdaexpression:ithastobeafunctionalinterface.函数接口,只有1个抽象方法的接口:@FunctionalInterfacepublicinterfa......
  • JavaWeb
    review:1.post提交方式下的设置编码,防止中文乱码request.setCharacterEncoding("utf-8");get提交方式,tomcat8开始,编码不需要设置tomcat8之前,get方式设置比较麻烦:Stringfname=request.getParameter("fname");byte[]bytes=fname.getBytes("iso-8859-1");fn......
  • Java代理模式
    一、基本概念1、代理模式:使用代理对象来代替目标对象的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。2、有静态代理和动态代理两种实现方式 二、静态代理静态代理是在编译时期就已经确定代理类的代码,在程序运行前就已经存在。静态代理......
  • Java序列化
    一、序列化和反序列化序列化:将数据结构或对象转换成二进制字节流的过程反序列化:将在序列化过程中产生的二进制字节流转换成数据结构或对象的过程 常见场景:1、网络传输时,对象需要先被序列化,接收到后再进行反序列化2、将对象持久化到磁盘、文件时需要先进行序列化,从磁盘或者......
  • Java线程池与异常处理
    线程池线程池的创建代码ThreadPoolExecutorthreadPoolExecutor=newThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,......
  • Java值传递
    一、形参&实参实参:实际传递给方法的参数形参:用于定义方法,接收实参,不需要有确定的值 二、值传递&引用传递值传递:方法接受的是实参值的拷贝,会创建副本引用传递:方法接收的是实参所引用对象在堆中的地址,不会创建副本,对形参的修改将影响到形参Java只有值传递  publicstati......
  • JAVA集合
    一、集合框架概览Java集合也叫做容器,由两大接口派生而来,一个是collection接口,主要用于存放单一元素,另一个是map接口,用于存放键值对。collection有三个子接口:list、set、queue。相较于数组,Java集合的优势在于它们的大小可变、支持泛型、具有内建算法,比如add(),remove()等。 l......
  • 2023 年要学习的 10 大 DevOps 技能
    2023年要学习的10大DevOps技能DevOps是两个不同领域的混合体,即开发和运维。这提高了更快地发布软件应用程序的能力,与传统软件开发方法相比,具有快节奏的改进和演变。它使团队能够更快地根据市场进行创新和适应,促进版本的增加,这有助于轻松识别和修复错误,并在改进团队间协作的帮......
  • 服务器内存跑满是什么原因造成的 43.248.101.x
    相信大家在使用服务器的时候会有出现内存使用率比较高的情况,那接下来小编跟大家说下到底是哪些原因导致内存不足:一、应用程序池应用程序池有一个默认回收的时间,到了这个时间就会自动释放内存,这个时间一般是1740分钟,而这种程度的时间可能会导致应用程序池无法及时释放内存,从而出现内......