java(21) - 注解详解
一.java注解(Annotation):
jdk5.0中添加了新的特性注解,与接口很类似,但注解也是java的一种类型,注解的作用非常多例如进行编译检查、生成说明文档、代码分析等。
jdk提供的常用注解:
1. @Override:
表示子类要重写父类对应的方法。
例子:
class Father {public void present(){System.out.println("Father");}public static void a(){System.out.println("a");}
}
public class Son extends Father {//@Override表示重写父类中的present()方法。@Overridepublic void present() {super.present();}/*静态方法是不能重写的,所以当我们加上@Override时,会提示错误。@Overridepublic static void a(){System.out.println("a");}*/
}
2.@Deprecated:
表示该方法是不建议使用的。
例子:
public class Test {@Deprecatedpublic void put(){System.out.println("Test");}
}
public class Test2 {public static void main(String[] args) {Test t = new Test();//当时用这个方法时就会有警告,表示当前方法是不赞成使用的。t.put();}
}
3.@SuppressWarnings:
该注解表示压制警告。
参数值列表:
deprecation:过时的类或方法警告。
unchecked:执行了未检查的转换时警告。
fallthrough:当Switch程序块直接通往下一种情况而没有Break时的警告。
path:在类路径、源文件路径等中有不存在的路径时的警告。
serial:当在可序列化的类上缺少serialVersionUID定义时的警告。
finally:任何finally子句不能完成时的警告。
all:关于以上所有情况的警告。
例子:
public class Test2 {@SuppressWarnings({ "deprecation" })public static void main(String[] args) {Test t = new Test();//当时用这个方法时就会有警告,表示当前方法是不赞成使用的。t.put();}
}
二.自定义注解:
如何定义注解:
public @interface MyAnnotation {//当我们使用value作为属性名时,我们在对其赋值时可以不指定属性的名称,而直接写上属性就可以了。这种方式只对value单一一个传值时才适用。//除value以外的属性名,则都需要 name=value 这种赋值方式,明确的指出赋值的对象是谁。//例如@SuppressWarnings({ "deprecation" }),如此的传值,如果多个值,就需要用花括号括起,每个值之间加逗号。String value() ;//默认值为hello。String hello() default "hello";
}
当我们使用@interface关键字定义一个注解时,该注解隐含的继承了java.lang.annotation.Annotation接口,如果我们定义了一个接口,并让接口继承Annotation,那么我们所定义的接口依然还是接口而不是注解,Annotation本身是借口而不是注解。
如何使用自定义注解:
public class Test {@MyAnnotation("a")public void a(){System.out.println("A");}@MyAnnotation(value="b",hello="c")public void b(){System.out.println("B");}
}
二.注解应用:
@Target的使用:
指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。
必需元素摘要 | |
---|---|
ElementType[]
|
value
|
public abstract ElementType[] value
当定义那种类型则只能对该类型的程序元素上使用该注解:
枚举常量摘要 | |
---|---|
ANNOTATION_TYPE 注释类型声明 |
|
CONSTRUCTOR 构造方法声明 |
|
FIELD 字段声明(包括枚举常量) |
|
LOCAL_VARIABLE 局部变量声明 |
|
METHOD 方法声明 |
|
PACKAGE 包声明 |
|
PARAMETER 参数声明 |
|
TYPE 类、接口(包括注释类型)或枚举声明 |
例子(只能用于方法的注解定义):
注解:
@Target(ElementType.METHOD)
public @interface MyAnnotation {}
public class MyTest {@MyAnnotation()public void a(){System.out.println(" a ");}@MyAnnotation()public void b(){System.out.println(" b ");}
}
当ElementType.METHOD则为专门对方法修饰的注解。如果放于其他位置则会报错。
对于注解如何使用反射:
@Retention
必需元素摘要 | |
---|---|
RetentionPolicy
|
value
|
public abstract RetentionPolicy value
枚举常量摘要 | |
---|---|
CLASS 编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。 |
|
RUNTIME 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。 |
|
SOURCE 编译器要丢弃的注释。 |
例子:
注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {//表示默认值为helloString hello() default "hello";String world();
}
public class MyTest {@Deprecated@MyAnnotation(world="java")public void output(){System.out.println("output !");}}
public class Test {public static void main(String[] args) throws Exception {Class<MyTest> c = MyTest.class;//获取指定的方法Method method = c.getMethod("output",new Class[]{});//如果指定类型的注释存在于此元素上,则返回 true,否则返回 falseif(method.isAnnotationPresent(MyAnnotation.class)){//执行output方法method.invoke(new MyTest(),new Object[]{});MyAnnotation ma = method.getAnnotation(MyAnnotation.class);//返回字符串String str = ma.hello();String str2 = ma.world();System.out.println(str+" , "+str2);}//获得方法上存在的注解类型Annotation[] annotations = method.getAnnotations();for(Annotation annotation : annotations){System.out.println(annotation.annotationType().getName());}}
}
打印:
output !
hello , java
java.lang.Deprecated
lzr.annotation.MyAnnotation
java(21) - 注解详解相关推荐
- java springmvc注解详解_springMVC注解开发详解(转)
1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...
- Java基本注解详解(超级详细)
原文链接: 今日头条 Java注解是一个很重要的知识点,用于对代码进行说明,可以对包.类.接口.字段.方法参数.局部变量等进行注解. 掌握好Java注解有利于学习框架底层实现.@mikechen Ja ...
- java自定义注解详解
一: 注解的概念 1.1 注解的官方定义 首先看看官方对注解的描述: An annotation is a form of metadata, that can be added to Java so ...
- java中注解 详解
本文将向你介绍J2SE5.0中的新特性之一:注解.本文将从什么是注解:J2SE5.0中预定义的注解:如何自定义注解:如何对注解进行注解以及如何在程序中读取注解5个方面进行讨论. 一.什么是注解 说起注 ...
- java method 注解_JAVA 注解详解及简单实例
JAVA 注解详解及简单实例 何为注解 注解(Annotation)又称为元数据,在JDK1.5后引入,它的作用是: 生成文档 这是注解的原始用途,可以通过注解生成JavaDoc文档 跟踪代码的依赖 ...
- Java基础13:反射与注解详解
Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...
- java拉姆达表达式事例,Java Lambda表达式详解和实例
简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体( ...
- java基础(十三)-----详解内部类——Java高级开发必须懂的
java基础(十三)-----详解内部类--Java高级开发必须懂的 目录 为什么要使用内部类 内部类基础 静态内部类 成员内部类 成员内部类的对象创建 继承成员内部类 局部内部类 推荐博客 匿名内部 ...
- 4.6 W 字总结!Java 11—Java 17特性详解
作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...
最新文章
- Python:PDB文件中原子和残基重新编号
- 5.7.20mysql修改密码,ubuntu系统mysql5.7.20忘记root密码修改
- 利用jquery getJSON 调用ashx实现ajax调用
- 统计问题(HDU-2563)
- vector中resize和reserve接口的异同
- C# in depth (第六章 实现迭代器的捷径)
- 【EXLIBRIS】图洛克《收入再分配的经济学》中译本序 【ZZ】
- 用vlc搭建简单流媒体服务器(UDP和TCP方式)-转 rtsp很慢才能显示
- Activity 生命周期图解
- 面试疑点:几道题答了一个小时,应该是等答案
- 苹果cms去掉html,苹果cmsV10 隐藏显示视频设置教程
- 微信小程序使用webview打开pdf文档及显示网页内容
- 谷哥学术2022年2月资源分享下载列表 16/20
- PHP爬虫的三种方法
- Android vivo美颜相机相册 照亮你的美 图片压缩 图片滤镜,裁剪(附带完整项目源码)
- Java后端开发工作 - 写接口
- H3C室外无线AP(WA4320X)胖瘦切换设置方法
- 数学建模方法-灰色预测
- java编程的一个猜数字有趣小游戏
- 华为和H3C--VRP基础和基本的操作