JAVA-注解(2)-自定义注解及反射注解
自定义注解开发
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)-自定义注解及反射注解的更多相关文章
- JAVA自定义注解 和 运行时靠 反射获取注解,解决 shiro 注解型权限因子获取问题
项目的权限分配,采用的是RBAC的设计模式.后台配置权限的时候,需要获取到所有的权限因子. 不经让我想起YII框架的SRBAC模块,还有以前的一个ecshop改造系统的权限配置方式,都采用的是PHP的 ...
- 【Java EE 学习 24 下】【注解在数据库开发中的使用】【反射+注解+动态代理在事务中的应用service层】
一.使用注解可以解决JavaBean和数据库中表名不一致.字段名不一致.字段数量不一致的问题. 1.Sun公司给jdbc提供的注解 @Table.@Column.@Id.@OneToMany.@One ...
- java反射--注解的定义与运用以及权限拦截
自定义注解类编写的一些规则: 1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是 ...
- java注解和自定义注解的简单使用
前言 在使用Spring Boot的时候,大量使用注解的语法去替代XML配置文件,十分好用. 然而,在使用注解的时候只知道使用,却不知道原理.直到需要用到自定义注解的时候,才发现对注解原理一无所知,所 ...
- java注解的自定义和使用
小伙伴们.今天我们来说说注解.标志@ .针对java不同版本来说,注解的出现是在jdk1.5 但是在jdk1.5版本使用注解必须继续类的方法的重写,不能用于实现的接口中的方法实现,在jdk1.6环境下 ...
- [转]Java中实现自定义的注解处理器
Java中实现自定义的注解处理器(Annotation Processor) 置顶2016年07月25日 19:42:49 阅读数:9877 在之前的<简单实现ButterKnife的注解功能& ...
- 大数据JavaWeb之java基础巩固----Junit&反射&注解
最近打算从0开始学学大数据,目前的主业是Android开发,但是当年毕业之后其实是搞J2EE的,所以打算没事又来拓展一下后台的技能,扩宽一下自己的知识体系对于自己的未来也能够多一些可能,另外大数据的一 ...
- 【JAVA】java注解的自定义和使用
java注解概念 Java提供了一种原程序中的元素关联任何信息和任何数据的途径和方法 java注解介绍 常用注解 @Override:表示方法是重写的方法 @Deprecated:过时的方法 @Sup ...
- Java注解-元数据、注解分类、内置注解和自定义注解|乐字节
大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解. Java注解有以下几个知识点: 元数据 注解的分类 内置注解 自定义注解 注解处理器 Ser ...
随机推荐
- shell多线程(2)之基于管道实现并发
在shell脚本里批量执行程序是比较常见的方式,如果程序很多,每个执行时间比较长,则顺序执行需要花费大量的时间. 此时并发就成为我们考虑的方向. 上篇<shell多线程>中我们已经简单实现 ...
- 安装metasploitable3的经验总结
一个月没有写学习记录了,但是这一个月一直没闲着,抽空写写自己装metasploitable3的经验教训(提示:只要你的环境配置没错,步骤没错,多试几次就会成功了,我总共测试了15次,,短的耗时30分钟 ...
- 分享android ADT百度云盘下载地址
由于android官网经常无法打开,特意把最新的android ADT和SDK放到了百度云盘进行了分享,目录中包含Windows和Macbook两种平台的版本,请自行选择: http://pan.ba ...
- 十分钟了解Kubernetes
何为Kubernetes? 最简单的一句话来概括Kubernetes. 它就是一套成熟的商用服务编排解决方案.Kubernetes定位在Saas层,重点解决了微服务大规模部署时的服务编排问题. Kub ...
- Prometheus 与 Grafana 集成
简介 Grafana 是一个可视化仪表盘,它拥有美观的图标和布局展示,功能齐全的仪表盘和图形编辑器,默认支持 CloudWatch.Graphite.Elasticsearch.InfluxDB.My ...
- Python自学day-12
一.Mysql概述 RDBMS:关系型数据库管理系统.Mysql是一种RDBMS. Oracle:收费 Mysql:Oracle旗下免费 Sqlserver:微软 DB2:IBM Postgresql ...
- VMware安装linux系统
- canvas 画布基本操作
const canvas = document.getElementById('canvas'); // 2.画笔 --- canvas的上下文对象 const ctx = canvas.getCon ...
- GRPC Oauth IdentityServer4
Server端 StartUp类: using System; using System.Collections.Generic; using System.Linq; using System.Th ...
- C# Redis分布式锁(基于ServiceStack.Redis)
相关的文章其实不少,我也从中受益不少,但是还是想自己梳理一下,毕竟自己写的更走心! 首先给出一个拓展类,通过拓展方法实现加锁和解锁. 注:之所以增加拓展方法,是因为合理使用拓展类(方法),可以让程序更 ...