注解

JDK 5开始,Java支持注解。

注解,Annotation,是一种代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取并执行,而且不改变原有的逻辑。

注解可以用于:生成文档、编译检查、代码分析。

基本注解
@Override 方法重写、方法覆盖
@Deprecated 已过时
@SuppressWarnings 压制编译器警告
@FunctionalInterface Java8新增。Java 8规定,如果接口中只有一个抽象方法,就是函数式接口(类方法和默认方法不限),此注解用来指定“必须是函数式接口”
@SafeVarargs Java7新增。将不带泛型的对象(如List[])赋给带泛型变量时,会发生堆污染(Heap pollution),此注解用来压制堆污染。
package ah.annotation;
import java.util.ArrayList;
import java.util.List;
class A {
@Deprecated
public void info() {
System.out.println("Deprecated:info");
}
public void warnings() {
@SuppressWarnings("unused")
String s = null;
@SuppressWarnings("all")
List myList = new ArrayList();
}
@SafeVarargs
public static void faultyMethod(List<String>... listStrArray) {
// Java 7新增注解
// Varargs:可变参数
// 形参【List<String>...】相当于数组,但Java不支持泛型数组,会将其当做List[]处理
// 将不带泛型的对象(如List[])赋给带泛型变量时,会发生堆污染(Heap pollution)
// 因此泛型可变参数容易导致堆污染
}
}
@FunctionalInterface
interface B {
// Java 8规定,如果接口中只有一个抽象方法,就是函数式接口(类方法和默认方法不限)
// 此注解用来指定“必须是函数式接口”
static void m1() {}
default void m2() {}
// 只一个抽象方法
void m3();
// 再一个抽象方法就出错: is not a functional interface
// void m4();
}
public class TestBaseAnnotation {
public static void main(String[] args) {
new A().info();
}
}

自定义注解

使用@interface定义注解。

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnnotation {
String id();
String name() default "A";
}

注解本质就是接口,接口的属性本质就是抽象方法。

// 将一个自定义注解反编译(javap MyAnnotation.class)后会得到如此代码
public interface MyAnnotation extends java.lang.annotation.Annotation {
public abstract java.lang.String id();
public abstract java.lang.String name();
}

元注解:用于描述注解的注解

@Target:注解能作用的位置

|--@Target(ElementType.TYPE):作用于类、接口、枚举

|--@Target(ElementType.METHOD):作用于方法

|--@Target(ElementType.FIELD):作用于成员变量

|--@Target(value = { ElementType.TYPE, ElementType.METHOD }):作用于多处

@Retention:注解被保留的阶段(retention,保留)

|--@Retention(RetentionPolicy.RUNTIME):保留到运行时。

|--|--自定义注解一般都取此值。注解信息会保留到class文件中,可以通过反射获取注解信息。

@Documented:注解是否被抽取到API文档中

@Inherited:被注解的类如果有子类的话,注解会被继承

注解的属性

(1)注解的属性以无参数方法的形式声明;

(2)返回值只能是:基本类型、字符串、枚举、注解,或其数组{数组赋值时用大括号,如果就一个值,大括号可以省略}。

(3)可以指定默认值;

(4)如果只有一个属性value,则可以直接赋值

|--|--如:@SuppressWarnings("all")

package ah.annotation;
import java.lang.annotation.*;
//枚举类型
enum MyEnum {
e1, e2;
}
// ========================
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation2 {
// 属性的返回值
int prop1();
String prop2();
MyEnum prop3();
Override prop4();
// =============
int[] prop11();
String[] prop12();
MyEnum[] prop13();
Override[] prop14();
}
// ========================
// 测试各种赋值操作用的注解
@interface MyAnn0 {
// 无属性的注解(如@Override)
}
@interface MyAnn1 {
int prop();// 单属性的注解
}
@interface MyAnn2 {
// 多属性的注解
int prop1();
int prop2();
}
@interface MyAnn_default {
// 默认值
int prop() default 1;
}
@interface MyAnn_value {
// 特殊属性value,如果仅1个属性,且叫value,赋值时可省略属性名
int value();
}
@interface MyAnn_type {
String s();
MyEnum e();
Override a();
int[] arr();
int[] arr2();
}
// ========================
// 用于注解的类
class UseAnno {
@MyAnn0
void m1() {}
@MyAnn1(prop = 1)
void m2() {}
@MyAnn2(prop1 = 1, prop2 = 2)
void m3() {}
@MyAnn_default
void m4() {}
@MyAnn_value(1)
void m5() {}
@MyAnn_type(s = "A", e = MyEnum.e1, a = @Override, arr = { 1, 2 }, arr2 = 3)
void m6() {}
}

Java基础教程——注解的更多相关文章

  1. Java基础教程:注解

    Java基础教程:注解 本篇文章参考的相关资料链接: 维基百科:https://zh.wikipedia.org/wiki/Java%E6%B3%A8%E8%A7%A3 注解基础与高级应用:http: ...

  2. Java基础教程(18)--继承

    一.继承的概念   继承是面向对象中一个非常重要的概念,使用继承可以从逻辑和层次上更好地组织代码,大大提高代码的复用性.在Java中,继承可以使得子类具有父类的属性和方法或者重新定义.追加属性和方法. ...

  3. Java基础教程:IDEA单元测试

    Java基础教程:IDEA单元测试 环境配置 使用idea IDE 进行单元测试,首先需要安装JUnit 插件. 安装JUnit插件步骤 File-->settings-->Plguins ...

  4. Java基础教程(12)--深入理解类

    一.方法的返回值   当我们在程序中调用方法时,虚拟机将会跳转到对应的方法中去执行.当以下几种情况发生时,虚拟机将会回到调用方法的语句并继续向下执行: 执行完方法中所有的语句: 遇到return语句: ...

  5. Java基础教程:网络编程

    Java基础教程:网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个s ...

  6. Java基础教程(5)--变量

    一.变量 1.变量的定义   正如上一篇教程<Java基础教程(4)--面向对象概念>中介绍的那样,对象将它的状态存在域中.但是你可能仍然有一些疑问,例如:命名一个域的规则和惯例是什么?除 ...

  7. Java基础教程:Lambda表达式

    Java基础教程:Lambda表达式 本文部分内容引用自OneAPM:http://blog.oneapm.com/apm-tech/226.html 引入Lambda Java 是一流的面向对象语言 ...

  8. Java基础教程:泛型基础

    Java基础教程:泛型基础 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...

  9. Java基础教程:多线程基础(1)——基础操作

    Java:多线程基础(1) 实现多线程的两种方式 1.继承Thread类 public class myThread extends Thread { /** * 继承Thread类,重写RUN方法. ...

随机推荐

  1. oracle 查询数据库锁及锁处理

    1.数据库锁表查询语句: SELECT SESS.SID, SESS.SERIAL#, LO.ORACLE_USERNAME, LO.OS_USER_NAME, AO.OBJECT_NAME 被锁对象 ...

  2. HTTP协议(2)

    HTTP协议主要是有HTTP请求报文和HTTP响应报文组成的. HTTP请求报文主要分为四个部分: 第一部分:请求行.独占一行,由请求方法.请求url以及协议/版本组成: 第二部分:请求头,第二行到第 ...

  3. Windows10系统下Hadoop和Hive开发环境搭建填坑指南

    前提 笔者目前需要搭建数据平台,发现了Windows系统下,Hadoop和Hive等组件的安装和运行存在大量的坑,而本着有坑必填的目标,笔者还是花了几个晚上的下班时候在多个互联网参考资料的帮助下完成了 ...

  4. 跟我一起学Redis之Redis配置文件啃了一遍之后,从尴尬变得有底气了

    前言 秋高气爽的一天,那时候年轻帅气的我正在参照着搜索引擎写代码,迷之微笑般的敲着键盘(又从搜索引擎上找到代码案例啦),突然领导在小隔间里传来了呼唤声,然后有了以下场景: 领导:小Z,你过来一下: 当 ...

  5. python爬虫使用scrapy框架

    scrapy框架提升篇 关注公众号"轻松学编程"了解更多 1.创建启动爬虫脚本 在项目目录下创建start.py文件: 添加代码: #以后只要运行start.py就可以启动爬虫 i ...

  6. Django之MTV实战(2)

    目录 1. 回顾知识 1.1 新增工程 1.2 创建新的APP 1.3 注册APP 1.4 编写URL和VIEW 1.5 验证结果如下: 2. 基本概念 2.1 专业术语 2.2 MTV之视图 2.2 ...

  7. mysql 快速清除数据表数据

    mysql> truncate tables; 例如: mysql> truncate email_managements;

  8. 2018noip游记

    2018noip游记 相隔一年多才想起可以弄一篇博客纪念一下我的首次比赛, 以现在的水平回望过去,发现很好玩很有纪念意义, 于是这篇博客诞生了 \(T1\) 当时的我刚学会什么是字符串,但仍然很不熟练 ...

  9. Linux 软件安装的三种方式

    Linux 软件安装的三种方式 1.yum ​ 语法格式: ​ yum -y install package.name ​ -y yes # 遇到提示自动输入yes ​ 案例: 安装ifconfig命 ...

  10. C++ 设计模式 1:概述

    1 设计模式概述 1.1 定义 设计模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案. 1.2 设计模式的种类 GoF 提出的设计模式有 23 个,包括: 创建型模式:如何创建对象 ...