Java从零开始学四十七(注解简述)

一、Java中注解Annotation

什么是注解:用来描述数据的数据(元数据)。

Java代码里的特殊标记。它为代码中添加用Java程序无法表达的额外信息提供一种形式化的方法,使用我们可以在未来的某一个时刻方便的使得这些注解修饰的程序元素。

 作用:

用将由编译器来测试和验证的格式,存储有关程序额外信息

生成 描述符文件,甚至是新的类定义

减轻编写模板代码的负担

使代码更加干净易读

注解和注释不同

注解与普通的代码注释有一定的区别,也有一定的联系。注解和注释都属于对代码的描述;

注释的作用只是简单的描述程序的信息,它不会被程序所读取;

注解则是Java代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理

通过使用注解,程序开发人员可以在不改变原有逻辑的情况下在源文件中嵌入一些补充的信息,代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者部署。

二、注解语法

使用注解时要在基前面加“@” 符号,同时将注解作为修饰符使用

所有的注解都继承了java.lang.annotation包下的Annotation接口

 注解语法规范

  • 将注解放在所有修饰符之前
  • 通常将注解单独放置在一行
  • 默认情况下,注解可用于修饰任何元素,包括类,方法,成员,变量等。

三、注解类型

内建注解(也称为基本注解),定义于java.lang包下

  • 限定重写父类方法:@Override
  • 标示已经过时:@Deprecated
  • 抑制编译器警告:@SupperssWarnings

元注解(Meta Annotation)

  • @Retention
  • @Target
  • @Documented
  • @Inherited

自定义注解

  使用@interface自定义注解

@Override

@Override只能用于修饰方法,而不能修饰其它的元素。

@Deprecated注解

    private String name;
    private String pwd;

    //标示这个属性已经过时,会在这个属性或者方法 名上加上删除线
    @Deprecated
    private int age;
    @Deprecated
    public String getName() {
        return name;
    }

@SuppressWarnings

    @SuppressWarnings("unused")
    public static void main(String[] args) {

        //没有定义泛型
        @SuppressWarnings("rawtypes")

        List list=new ArrayList();

四、元注解

元注解用来修饰其它的注解位于java.lang.annotation下

元注解(Meta Annotation)

  • @Retention:用于指定被修饰的注解可以保留多长时间,包含一个RetentionPolicy类型的value成员变量,使用Retetion时必须为该value成员变量指定值
  • @Target:有唯一的value作为成员变量,value的类型为java.lang.annotation.ElementType[]是被标注的枚举类型
  • @Documented:用于指定被修饰的注解将被javadoc工具提取成文档,没有成员变量
  • @Inherited:用于指定被修改的注解将具有继承性

五、自定义注解

使用@interface 关键字

注解类型和接口的相似之处

都可以定义常量,静态成员(如枚举类型定义)。注解类型也可以像接口一样被实现或者被继承

package com.pb.annotation.diy;

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;

/**
 *自定义注解需要使用@interface关键字
 *
 */
//设置注解可以为javadoc获取为帮助文档
@Documented
/*
 * @Retention有如下参数(注解的生命周期)
 *         RetentionPolicy.SOURCE:注解被编译器丢弃
 *         RetentionPolicy.CLASS:注解保存在class类当中,被虚拟机忽略
 *         RetentionPolicy.RUNTIME:注解被保存在class类当中,被虚拟机读取
 * */
@Retention(RetentionPolicy.RUNTIME)
/*
 * target 有如下参数:
 *         TYPE : 注解目标是类、接口
 *         FIELD: 注解目标是字段
 *         METHOD:注解目标是方法
 *         PARAMETER:注解目标是方法的参数
 *         CONSTRUCTOR:注解目标是构造函数
 *         LOCAL_VARIABLE:注解目标是局部变量
 * */
@Target(value={ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})
/*
 * 可以被继承
 */
@Inherited
public @interface MyAnnotation {
    //设置注解成员变量并赋初始值
    String name() default "张三";
    int age()         default 21;

}

读取注解信息

package com.pb.annotation.diy;

import java.lang.annotation.Annotation;

public class MyAnnotationTest {

    @MyAnnotation(name="Jack",age=32)
    public void getInfo(){

        try {
            //获取当前getInfo()方法中包含的所有注解
            @MyAnnotation
            Annotation [] annos=MyAnnotationTest.class.getMethod("getInfo").getAnnotations();
            //注解数组
            for (Annotation an : annos) {
                if(an instanceof MyAnnotation){
                    System.out.println("an 是"+an);
                    System.out.println("注解中的name:"+((MyAnnotation) an).name());
                    System.out.println("注解中的age:"+((MyAnnotation) an).age());
                }
            }

        } catch (NoSuchMethodException | SecurityException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        MyAnnotationTest mt=new MyAnnotationTest();
        mt.getInfo();
    }

}
时间: 2024-08-10 18:59:48

Java从零开始学四十七(注解简述)的相关文章

Java从零开始学四十一(反射简述二)

一.实例化Class类对象 实例化Class类对象的方法有三种: 第一种:通过forName()方法 第二种:类.class 第三种:对象.getClass() 二.Class类的常用方法 No. 方法 类型 描述 1 public static Class<?> forName(String className) throws ClassNotFoundException 普通 传入完整的“包.类”名称实例化Class对象 2 public Constructor[] getConstruc

Java从零开始学四十(反射简述一)

一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反射.通过反射,Java可以于运行时加载.探知和使用编译期间完全求和的类.生成其对象实体,调用其方法或者对属性设值.所以Java算是一个半动态的语言吧. 反射的概念: 在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方

Java从零开始学四十二(DOM解析XML)

一.DOM解析XML xml文件 favorite.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <PhoneInfo name="手机品牌"> <Brand name="华为"> <Type name="U8650"> </Type> </Brand

Java从零开始学三十七(JAVA IO- 二进制文件读写)

一.简述 二.使用步骤 DataInputStream: 引入相关的类 构造数据输入流的对象(如:FileInputStream,BufferedWriter包装后读取文件等) 读取二进制文件的数据 关闭数据输入流 DataOutputStream: 引入相关的类 构造数据输出流的对象(如:FileOputStream,BufferedWriter包装后写入文件等) 写入二进制文件的数据 关闭数据输入流 三.使用 package com.pb.data; import java.io.Buffe

Java从零开始学四十五(Socket编程基础)

一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机. 而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的. 目前较为流行的网络编程模型是客户机/服务器(C/S)结构.即通信双方一方作为服务器等待客户提出请求并予以响应.客户则

Java从零开始学四十四(多线程)

一.进程与线程 1.1.进程 进程是应用程序的执行实例. 进程是程序的一次动态执行过程,它经历了从代码加载.执行到执行完毕的一个完整过程,这个过程也是进程本身从产生.发展到最终消亡的过程 特征: 动态产生,动态消亡. 进程是并发性的. 进程独立性.是一个独立运行的基本单位,也是系统分配资源和调度的基本单位 1.2.线程 多线程是实现并发机制的一种有效手段.进程和线程一样,都是实现并发的一个基本单位 线程:进程内部的一个执行单元,它是程序中一个单一的顺序控制流程 特点: 线程依赖进程生存 一个进程

Java从零开始学二十七(NumberFormat类)

一.NumberFormat表示数字的格式化类 NumberFormat表示数字的格式化类,即:可以按照本地的风格习惯进行数字的显示. No. 方法 类型 描述 1 public static Locale[] getAvailableLocales() 普通 返回所有语言环境的数组 2 public static final NumberFormat getInstance() 普通 返回当前默认语言环境的数字格式 3 public static NumberFormat getInstanc

Java从零开始学四(数据类型)

一.Java数据类型划分 二.基本数据类型 No. 数据类型 大小/位 可表示的数据范围 1 long(长整数) 64 -9223372036854775808 ~ 9223372036854775807 2 int(整数) 32 -2147483648 ~ 2147483647 3 short(短整数) 16 -32768~32767 4 byte(位) 8 -128 ~ 127 5 char(字符) 2 0 ~ 255 6 float(单精度) 32 -3.4E38(-3.4´1038) ~

Java从零开始学四十三(DOM4j解析XML)

一.创建XML // 建立XML public static void gernatorXML() { // 创建Document对象 Document doc = DocumentHelper.createDocument(); // 创建根节点students Element studentsElement = doc.addElement("students"); // 创建子节点student Element studentElement1 = studentsElement.