自定义注解开发

  1.开发一个注解类

    开发一个注解类的过程,非常类似于开发一个接口,只不过需要通过@interface关键字来声明

  2.使用元注解修饰注解的声明

    所谓的原注解是用来修饰注解声明的注释,可以控制被修饰的注解的特性。

    @Target

      用来声明被修饰的注解可以用在什么位置。

      可以在@Target的属性中设置Element Type类型的数组来指定可以使用的位置。

      如果不使用此原注解修饰,默认注解可以用在任意位置。

    @Retention

      用来声明被修饰的注释会被保留到什么阶段。

      可以在该注解的属性中通过RetentionPolicy类型的值来指定注释被保留到何时。

        (1)RetentionPolicy.SOURCE

            此注解将会被保留到源码阶段,java中,在编译过程中被删除。

            这种类型的注解通常是给编译器看的。

        (2)Retention Policy.CLASS

            此注解将会被保留到源码阶段和编译阶段,.java和.class中,在类加载的过程中被删除。

            这种类型的注解通常是给类加载器看的。

        (3)RetentionPolicy.RUNTIME

            此注解将会被保留在源码阶段、编译阶段和运行阶段,.java  .class和内存中的字节码中都会存在。

            这种类型的注解通常在运行阶段进行反射,控制程序运行过程。

         ***只有RUNTIME级别的注解才可以通过反射技术进行反射。

    @Documented

        用来声明被修饰注解是否要被文档提取工具提取到文档中。

        默认不提取

    @Inherited

        被修饰的注释是否具有继承性

        默认没有继承性

  3.为注解增加属性

    注解类中还可以有声明属性。

    为注解类声明属性的过程非常类似于接口定义方法。

    但要求,注解中的所有的属性必须是public的,可以显式声明,也可以不声明,不声明默认就是public的。

    注解中的属性只能是八种基本数据类型、String类型、Class类型、其他注解类型及以上类型的一维数组。

    注解中声明的属性 需要在使用注解时,为其赋值,赋值的方式就是在使用注解时,在注解后跟上一对小括号,在括号中通过  属性名=属性值   的方式指定属性的值

    也可以在声明注解时,在注解的属性后面通过default关键字,声明属性的默认值,这样一来,使用注解时不赋值,将会使用default默认值,当然也可以手动赋值,覆盖默认值。

    如果属性是一维数组类型,在传入的数组中,只有一个值,则包括数组的大括号也可以省略。

    如果注解的属性只有一个需要赋值,且该属性的名称叫做value,则在使用注解时,value==可以不写

反射注解

  1.反射注解的原理

    RetentionPolicy.RUNTIME级别的注解会保留到运行中,可以通过反射技术获取,从而可以根据是否有注解 或 注解属性值的不同来控制程序按照不同方式运行。

    以下反射相关的类型中都提供了反射注解的方法:

      类Class<T>、类Method、类FIeld、类Constructor<T>、类Package

    

  2.反射注解案例

 package cn.tedu.test;

 import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface level{
String value();
} @level("刑警")
class Police{
} public class AnnoTest02 {
public static void main(String[] args) {
System.out.println("敬了个礼,您好,您超速了,罚款200元。。。");
if(Police.class.isAnnotationPresent(level.class)){
level anno = Police.class.getAnnotation(level.class);
if("协警".equals(anno.value())){
System.out.println("哥们少罚点,50块得了~~");
}else if("交警".equals(anno.value())){
System.out.println("哥们抽根烟,这是200块,收好我走人~~");
}else if("刑警".equals(anno.value())){
System.out.println("赶紧交钱走人,别查出 别的事。。。");
}else{
System.out.println("xxx");
}
}else{
System.out.println("打一顿,扭送警察局。。");
}
}
}

JAVA-注解(2)-自定义注解及反射注解的更多相关文章

  1. JAVA自定义注解 和 运行时靠 反射获取注解,解决 shiro 注解型权限因子获取问题

    项目的权限分配,采用的是RBAC的设计模式.后台配置权限的时候,需要获取到所有的权限因子. 不经让我想起YII框架的SRBAC模块,还有以前的一个ecshop改造系统的权限配置方式,都采用的是PHP的 ...

  2. 【Java EE 学习 24 下】【注解在数据库开发中的使用】【反射+注解+动态代理在事务中的应用service层】

    一.使用注解可以解决JavaBean和数据库中表名不一致.字段名不一致.字段数量不一致的问题. 1.Sun公司给jdbc提供的注解 @Table.@Column.@Id.@OneToMany.@One ...

  3. java反射--注解的定义与运用以及权限拦截

    自定义注解类编写的一些规则: 1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是 ...

  4. java注解和自定义注解的简单使用

    前言 在使用Spring Boot的时候,大量使用注解的语法去替代XML配置文件,十分好用. 然而,在使用注解的时候只知道使用,却不知道原理.直到需要用到自定义注解的时候,才发现对注解原理一无所知,所 ...

  5. java注解的自定义和使用

    小伙伴们.今天我们来说说注解.标志@ .针对java不同版本来说,注解的出现是在jdk1.5 但是在jdk1.5版本使用注解必须继续类的方法的重写,不能用于实现的接口中的方法实现,在jdk1.6环境下 ...

  6. [转]Java中实现自定义的注解处理器

    Java中实现自定义的注解处理器(Annotation Processor) 置顶2016年07月25日 19:42:49 阅读数:9877 在之前的<简单实现ButterKnife的注解功能& ...

  7. 大数据JavaWeb之java基础巩固----Junit&反射&注解

    最近打算从0开始学学大数据,目前的主业是Android开发,但是当年毕业之后其实是搞J2EE的,所以打算没事又来拓展一下后台的技能,扩宽一下自己的知识体系对于自己的未来也能够多一些可能,另外大数据的一 ...

  8. 【JAVA】java注解的自定义和使用

    java注解概念 Java提供了一种原程序中的元素关联任何信息和任何数据的途径和方法 java注解介绍 常用注解 @Override:表示方法是重写的方法 @Deprecated:过时的方法 @Sup ...

  9. Java注解-元数据、注解分类、内置注解和自定义注解|乐字节

    大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解. Java注解有以下几个知识点: 元数据 注解的分类 内置注解 自定义注解 注解处理器 Ser ...

随机推荐

  1. Linux ssh及远程连接工具

    putty:http://www.so.com/link?url=http%3A%2F%2Fsoftdl.360tpcdn.com%2FPuTTY%2FPuTTY_0.67.zip&q=put ...

  2. 为什么Python中“2==2>1”结果为True

    在Python中,你可能会发现这样一个奇怪的现象: >>> 2 == 2 > 1 True >>> (2 == 2) > 1 False >> ...

  3. spring之@value详解二(转载)

    1.1 前提 测试属性文件:advance_value_inject.properties server.name=server1,server2,server3 #spelDefault.value ...

  4. 跟我学SpringCloud | 第一篇:介绍

    首先讲一下我为什么要写这一系列的文章,现在网上大量的springcloud相关的文章,使用的springboot和springcloud的版本都相对比较老,很多还是在使用springboot1.x的版 ...

  5. HBase 学习之路(七)——HBase过滤器详解

    一.HBase过滤器简介 Hbase提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predica ...

  6. spring cloud 系列第6篇 —— zuul 服务网关 (F版本)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.zuul简介 1.1 API 网关 api 网关是整个微服务系统的门面 ...

  7. 【nginx】反向代理

    反向代理事项负载均衡 是什么:百度 版本 :tomcat8 x2 nginx 1.8.1 保证两台tomcat正常启动. 配置文件:D:\nginx-1.8.1\conf\nginx.conf ,红色 ...

  8. SpringBoot(十九)_404返回统一异常处理结果

    之前写过一篇统一异常处理的文章,今天测试了下如果访问一个不存在的接口,也想返回统一的错误信息,应该怎么做 1.修改application.properties文件 # 自定义404 #出现错误时, 直 ...

  9. Ural 2072:Kirill the Gardener 3(DP)

    http://acm.timus.ru/problem.aspx?space=1&num=2072 题意:有n朵花,每朵花有一个饥渴值.现在浇花,优先浇饥渴值小的(即从小到大浇),浇花需要耗费 ...

  10. vue中局部组件的使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...