注解的实现

1.概念

注解表示一个标识(标注、标记),它可以用在类上、方法上、变量上等,给类的各个组成部分一些额外的表示,能够被编译器识别。

2.常见注解

@Override: 描述一个方法是复写的父类方法
@Deprecate: 描述一个方法是过时的方法,调用过时的方法会有一个横线
@SuppressWarnings(value = “all”): 压制警告:写在类上,则压制整个类的警告,在方法上则压制方法上的警告

3.自定义注解

【在使用注解的时候如果注解里面的属性没有指定默认值,那么我们就需要手动给出注解属性的设置值。】

public @interface Anno {//定义一个基本类型的属性//public属性类型属性名() default 默认值;int a() default 23 "张三";//定义一个String类型的属性public String name() default 23;//定义一个class类型的属性public  Class clazz() default  Anno2.class;//定义一个注解类型的属性public Anno2 anno() default  @Anno2;//定义一个枚举类型的属性public Week week() default Week.Monday;//以上类型的一维数组//int 数组public int [] arr() default {1,2,3,4,5}//枚举数组public Week[] weeks() default{Week.Monday}public String value();//特殊属性value 变量只有一个,则使用时可以省略名称直接赋值
}//类上使用注解
//在使用注解的时候如果注解里面的属性没有指定默认值,那么我们就需要手动给出注解属性的设置值。
//此处相当于Anno的对象,只是给类或者方法添加了一个标签,不会影响实体
@Anno("李四")
public class Demo1 {public static void main(String[] args) {}
}
4.元注解

@Target:指定了注解能在哪里使用【成员变量、类、方法】
@Retention:可以理解为保留时间(生命周期)
@lnherited:表示修饰的自定义注解可以被子类继承
@Documented:表示该自定义注解,会出现在API文档里面

//定义特殊属性value
@Retention(RetentionPolicy.RUNTIME) //注解在运行时期有效
@Target(ElementType.TYPE)//注解可以使用在类上
//@Target(ElementType.METHOD)//注解可以使用在方法上
//@Target(ElementType.FIELD)//注解可以使用在成员变量上
@Inherited//表示修饰的自定义注解可以被子类继承
public @interface Anno {
}//测试类
public class Demo2 {public static void main(String[] args) throws ClassNotFoundException {//得到类的字节码对象Class<?> personClazz = Class.forName("com.itheima3.Person");//getAnnotation(Anno.class);得到该类的注解对象Anno a1 = personClazz.getAnnotation(Anno.class);Class<?> studentClazz = Class.forName("com.itheima3.Student");Anno a2 = personClazz.getAnnotation(Anno.class);System.out.println(a1==a2);}
}打印结果
true
5.自定义注解实现

测试让有注解的方法执行,没有Test的方法不执行

//自定义注解
//元注解[对注解进一步进行说明]
@Target(ElementType.METHOD)//指定注解可以用在哪些地方
@Retention(RetentionPolicy.RUNTIME)//表示注解的存活时间可以到运行
//定义一个注解
public @interface Test {
}//方法类
public class UseTest {//没有使用Test注解public void show(){System.out.println("UseTest....show....");}//使用Test注解@Testpublic void method(){System.out.println("UseTest....method....");}//使用Test注解@Testpublic void function(){System.out.println("UseTest....function....");}
}//测试类
//测试让有注解的方法执行,没有Test的方法不执行
public class AnnoDemo {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {//通过反射获取UseTest的字节码文件对象Class<?> clazz = Class.forName("com.itheima2.UseTest");//2.通过反射获取这个类里面所有方法的对象Method[] methods = clazz.getDeclaredMethods();//创建对象用于执行方法Object o = clazz.getConstructor().newInstance();//遍历数组,得到每一个方法对象for (Method method : methods) {//getAnnotation(Test.class)返回原方法上额外的注解Test test = method.getAnnotation(Test.class);//如果有注解,就执行if (test != null) {//注解没有设置存活时间,则打印无结果method.invoke(o);}//method.isAnnotationPresent(Test.class)判断方法上是否有注解,有则返回true/*if(method.isAnnotationPresent(Test.class)){method.invoke(o);}*/}}
}打印结果:
-------------------------------------------------------------------------------
UseTest....method....
UseTest....function....

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java对象引用四个级别(强、软、弱、虚)

转载自 Java对象引用四个级别&#xff08;强、软、弱、虚&#xff09; 最近&#xff0c;高级Java技术栈微信群中&#xff0c;有一些猿友在讨论JVM中对象的周期问题&#xff0c;有谈到引用的级别&#xff0c;现在为大家做个总结吧&#xff0c;虽然大多数公司并没有意识或者用到这…

反射和配置文件的实际应用

1.利用反射完成不同参数赋值 <1>无参构造[默认赋值] Student 和 Teacher皆为JavaBean类 public class Demo1 {public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {//…

thinking-in-java(13) String字符串

【13.1】不可变String 1&#xff09;String对象是不可变的&#xff0c;具有只读特性&#xff1b; 【荔枝-String对象是不可变的】 public class Immutable {public static String upcase(String s) {return s.toUpperCase();}public static void main(String[] args) {Strin…

Java7任务并行执行神器:ForkJoin框架

转载自 Java7任务并行执行神器&#xff1a;Fork&Join框架Fork/Join是什么&#xff1f;Fork/Join框架是Java7提供的并行执行任务框架&#xff0c;思想是将大任务分解成小任务&#xff0c;然后小任务又可以继续分解&#xff0c;然后每个小任务分别计算出结果再合并起来&#…

单元测试和日志技术

1.Junit使用的基本流程 <1>将junit的jar包导入到工程中 <2>编写测试方法该测试方法必须是公共的无参数无返回值的非静态方法在测试方法上使用Test注解标注该方法是一个测试方法 <3>选中测试方法右键通过junit运行该方法 Junit点击下载 2.Junit常用的三个注…

DB2书籍推荐!

链接&#xff1a; http://blog.csdn.net/db2cn/article/details/4336619第一本《循序渐进DB2——DBA系统管理、运维与应用案例》&#xff1a;内容简介DB2数据库是IBM 公司关系型数据库核心产品&#xff0c;在国内以及全球有着广泛的应用。针对DB2初学者&#xff0c;本书循序渐进…

@Controller,@Service,@Repository,@Component详解

转载自 Controller,Service,Repository,Component详解 Controller 用来表示一个web控制层bean&#xff0c;如SpringMvc中的控制器。 Service 用来表示一个业务层bean。 Repository 用来表示一个持久层bean&#xff0c;即数据访问层DAO组件。 Component 用来表示一个平常的普通组…

thinking-in-java(12)通过异常处理错误

【12.0】开场白1&#xff09;java的基本理念&#xff1a;结构不佳的代码不能运行&#xff1b;2&#xff09;改进的错误恢复机制&#xff1a;是提供代码健壮性的最强有力的方式&#xff1b;3&#xff09;java异常&#xff1a;3.1&#xff09;java采用异常来提供一致的错误报告模…

分布式系统架构常识:CAP理论

转载自 分布式系统架构常识&#xff1a;CAP理论什么是CAP理论&#xff1f; 2000年7月&#xff0c;加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想。2年后麻省理工学院的Seth Gilbert和NancyLynch从理论上证明了CAP&#xff0c;之后CAP理论正式成为分布式计算…

GIt代码管理仓库

1.Git的概念 a.Git是一个代码版本控制工具&#xff0c;有下面几个特点 <1>Git可以用于备份项目代码 <2>Git可以管理代码的各个版本 <3>Git可以方便大家协同工作 <4>Git可以方便代码追责 b.Git和SVN对比 SVN是集中式的版本控制系统&#xff0c;而Git是…

程序员三年的门槛该如何跨过去?

转自&#xff1a; http://blog.csdn.net/singit/article/details/78668490第一阶段&#xff1a;三年 我认为三年对于程序员来说是第一个门槛&#xff0c;这个阶段将会淘汰掉一批不适合写代码的人。这一阶段&#xff0c;我们走出校园&#xff0c;迈入社会&#xff0c;成为一名程…

静态资源Html基础语法

1.div划分【样式控制】 <style>div {/*显示边框*/border: 1px solid pink;/*宽度 占用屏幕的60%*/width: 60%;/*高度 500像素*/height: 500px;/*边框外边距*/margin: auto;/*文字居中*/text-align: center;/*height: 500px;*//*line-height: 500px;*/}</style>2.d…

关系型数据的分布式处理系统:Cobar

转载自 关系型数据的分布式处理系统&#xff1a;CobarCobar简介 Cobar是关系型数据的分布式处理系统&#xff0c;它可以在分布式的环境下像传统数据库一样为您提供海量数据服务。Github&#xff1a;https://github.com/alibaba/cobar整体架构图&#xff1a;快速启动场景 系统对…

thinking-in-java(16) 数组

【16.1】数组有什么特殊 1&#xff09;数组与其他类型容器的区别&#xff1a; 效率&#xff0c;类型和保持基本类型的能力&#xff1b;数组是效率最高的存储和随机访问对象引用序列的方式&#xff1b;数组大小固定&#xff0c;容器大小可以不固定&#xff0c;所以这增加了弹性…

推荐一个在线创作流程图、思维导图软件—ProcessOn

转载自 推荐一个在线创作流程图、思维导图软件—ProcessOn 最近要画流程图&#xff0c;破解了半天Visio2016没搞定&#xff0c;2016的估计都被封了&#xff0c;Visio收费又过贵&#xff0c;又不想折腾低版本的破解&#xff0c;所以找了个在线画图平台ProcessOn&#xff0c;没想…

静态资源Css基础语法

1.css的引入方式 <1>内联样式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>引入方式1</title> </head> <body><!--内联样式--><h1 style"color: red; fon…

DevExperience(1712)

【1】在 DML 或 DDL 语句中&#xff0c;不要添加 数据库表前缀&#xff1a; 因为开发环境的数据库表名 和 生产环境的数据库表名 有可能不一样&#xff1b; 这个时候就有可能报 SQL 异常&#xff1b;造成生产事故&#xff1b;不推荐&#xff1a; select * from db_name.tbl_nam…

常用缓存淘汰算法(LFU、LRU、ARC、FIFO、MRU)

转载自 常用缓存淘汰算法&#xff08;LFU、LRU、ARC、FIFO、MRU&#xff09;缓存算法是指令的一个明细表&#xff0c;用于决定缓存系统中哪些数据应该被删去。 常见类型包括LFU、LRU、ARC、FIFO、MRU。最不经常使用算法&#xff08;LFU&#xff09;&#xff1a; 这个缓存算法使…

动态资源Servlet接口

1.Servlet接口的作用 Servlet是运行在Web服务器上的应用程序。Servlet本身是一个Java接口&#xff0c;它定义了浏览器访问服务器程序的规则&#xff0c;我们写服务器程序只需要按照需求复写Servlet方法即可 2.Servlet的体系结构 <1>直接继承实现类结构 <2>其他…