自定义注解开发

  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. nvm淘宝源升级安装最新稳定版nodejs

    为了在服务器上面升级nodejs,用nvm下载实在太慢了,推荐淘宝源安装命令,非常快能安装好: 第一步: NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mi ...

  2. Zookeeper详解-工作流和leader选举(三)

    一.工作流 一旦ZooKeeper集合启动,它将等待客户端连接.客户端将连接到ZooKeeper集合中的一个节点.它可以是leader或follower节点.一旦客户端被连接,节点将向特定客户端分配会 ...

  3. Hyperledger Fabric1.4的多机部署

    之前的文章深入解析Hyperledger Fabric启动的全过程主要讲解了Fabric的网络搭建,以及启动的整体流程,但是都是通过单机完成的.而区块链本身就是去中心化的,所以最终还是要完成Fabri ...

  4. 《周四橄榄球之夜》流媒体视频拆解:Twitch VS Amazon Prime

    文 / Phil Cluff 译 / 王月美 原文链接:https://mux.com/blog/thursday-night-football-streaming-technology-showdo ...

  5. orale数据库to_char时间中英文转换

    一.显示中文星期天 select to_char(sysdate,'day','NLS_DATE_LANGUAGE=''SIMPLIFIED CHINESE''') from dual; 二.显示英文 ...

  6. eclipse下jdbc数据源与连接池的配置及功能简介

    今天在做四则运算网页版的时候遇到了一个困惑,由于需要把每个产生的式子存进 数据库,所以就需要很多次重复的加载驱动,建立连接等操作,这样一方面写程序不方便,加大了程序量,另一方面,还有导致数据库的性能急 ...

  7. mail.inc实现周密的留言发邮箱

    我网站上很多地方都有给我留言的链接,这些链接指向一个地方 http://www.dushangself.site/emlog/?post=8 (源码使用方式:一共四个源代码,第一个和第二个写在一起,, ...

  8. Smobiler实现手机弹窗

    前言 在实际项目中有很多场景需要用到弹窗,如图1 那么这些弹窗在Smobiler中如何实现呢? 正文 Smobiler实现弹窗有两种方式:1.MessageBox.Show 2.ShowDialog和 ...

  9. HDU 1565:方格取数(1)(最大点权独立集)***

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 题意:中文. 思路:一个棋盘,要使得相邻的点不能同时选,问最大和是多少,这个问题就是最大点权独立集. 可以 ...

  10. java 及 Jquery中的深复制 浅复制

    发现问题:最近 遇到由于复制对象之后,改变复制后的新变量,原先被复制的对象居然会跟着变. EX:java中: //holidayConfig.getEnd_time()会随着sTime的改变而改变 s ...