zoukankan      html  css  js  c++  java
  • java自定义注解和实例

    注解的好处:

    1.能够读懂别人写的代码,特别是框架相关的代码。

    2.本来可能需要很多配置文件,需要很多逻辑才能实现的内容,就可以使用一个或者多个注解来替代,这样就使得编程更加简洁,代码更加清晰。

    3.(重点)刮目相看。
    (但是怎么样才能让别人刮目相看呢?会用注解不是目的,最重要的是要使用自定义注解来解决问题。)
    举个栗子:
    如果面试的时候,你跟老板说你会使用注解,老板觉得你这个人还行;但是如果老板发现你会自定义注解解决问题,老板肯定就会眼前一亮。

    元注解

    1、元注解(meta-annotation):

      元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:
        1.@Target 用于描述注解的使用范围(即:被描述的注解可以用在什么地方)


        2.@Retention 表示需要在什么级别保存该注释信息,用于描述注解的生命周期


        3.@Documented 说明子类可以继承父类中的该注解


        4.@Inherited 说明该注解将被包含在javado

    四个定义注解时候的限定数据
    
    @Target(ElementType.TYPE)           :接口、类、枚举、注解
    @Target(ElementType.FIELD)          :字段、枚举的常量
    @Target(ElementType.METHOD)         :方法
    @Target(ElementType.PARAMETER)      :方法参数
    @Target(ElementType.CONSTRUCTOR)    :构造函数
    @Target(ElementType.LOCAL_VARIABLE) :局部变量
    @Target(ElementType.ANNOTATION_TYPE):注解
    @Target(ElementType.PACKAGE)        :包
    
    @Retention(RetentionPolicy.SOURCE)  :在源文件中有效(即源文件保留)
    @Retention(RetentionPolicy.CLASS)   :在class文件中有效(即class保留)
    @Retention(RetentionPolicy.RUNTIME) :在运行时有效(即运行时保留)
    
    @Inherited:说明子类可以继承父类中的该注解
    
    @Document:说明该注解将被包含在javado

     使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。

      定义注解格式:
      public @interface 注解名 {定义体}

      注解参数的可支持数据类型:

        1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
        2.String类型
        3.Class类型
        4.enum类型
        5.Annotation类型

    自定义注解实例

    package cn.baby.note;

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;

    /**
    * Created by Administrator on 2017/10/8.
    */
    @Target(ElementType.METHOD)//用于描述注解的使用范围(即:被描述的注解可以用在什么地方)里面属属性取值网上找或者下载API
    @Retention(RetentionPolicy.RUNTIME)//表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
    public @interface Fruit {
    // 定义注解的参数,类型可以为基本类型以及String、Class、enum、数组等,default为默认值
    int id() default 0;
    String name() default "威哥";
    }

     注解的用法

     1 package cn.baby.note;
     2 
     3 /**
     4  * Created by Administrator on 2017/10/9.
     5  */
     6 public class FruitTest {
     7     //该注解值能用在方法上其中注解里面还有个参数有默认值,可给可不给
     8     @Fruit(id = 1)
     9     public void show(){
    10         System.out.println("我是方法上的自定义注解");
    11     }
    12 }

     注解参数的获取利用反射的机制获取

    运行结果

  • 相关阅读:
    批量新增百万条数据 十百万条数据
    sqlserver 组内排序
    EF ++属性会更新实体
    Entity Framework Core: A second operation started on this context before a previous operation completed
    abp Cannot access a disposed object. A common cause of this error is disposing
    abp xunit Can not register IHostingEnvironment. It should be a non-abstract class. If not, it should be registered before.”
    hangfire enqueued but not processing(hangfire 定时任务入队列但不执行)
    EF 更新实体 The instance of entity type 'BabyEvent' cannot be tracked because another instance
    datatable to entiy list 不支持可空类型和枚举类型
    webapi 设置不显示接口到swaggerUI
  • 原文地址:https://www.cnblogs.com/liuzhiw/p/7638091.html
Copyright © 2011-2022 走看看