注释和注解不一样
注释是给程序员看的,注解是给程序看的
需要理解Socket,tomcat等内容
一、什么是注解
1. 注解的作用
①:注解一般用于对程序的说明,就像注释一样,但是区别是注释是给人看的,但是注解是给程序看的。
②:让编译器进行编译检查的作用,比如下边这个@Override注解是重写的意思,子类重写了父类的方法,但是改动了方法名,所以报错。
public class Demo implements Animal{
public Stringg name ="张三”
@0verride
public void aaa(){
}
}
2. 注解的格式
注解是以“@注释名”在代码当中存在的,还可以添加一些参数值,例如
@SuppressWarnings(value = "unchecked")
3. 注解在哪里使用
可以附加在package、class、method、field等上面,相当于给他们添加了额外的辅助信息。我们可以通过反射的方式对这些注解进行访问。
二、注解的类型
一般常用的注解分为三类:
1. 内置注解
@Override:修辞方法的,表示一个方法重写了父类方法
public class Demo extends Objects{
@Override
public String toString(){
return super.toString();
}
}
@Deprecated:修辞方法、属性、类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。通俗来说就是遗弃。
public class Demo extends Objects{
@Deprecated// 表明该方法被遗弃
public String toString(){
return super.toString();
}
}
@SuppressWarnings:用来抑制编译时的警告信息,括号里的的值包括
a.deprecation:使用了过时的类或方法的警告
b.unchecked:执行了未检查时的转换时的警告,集合就是未指定泛型
c.fall through:当在switch语句使用时发生case穿透
d.path:在类路径、源文件路径等中有不存在路径的警告
e.serial:可序列化类上缺少serialVerisonUID定义时的警告
f.finally:任何finally橘子不能完成时的警告
g.all:以上所有情况的警告。
一个 @SuppressWarnings("all"),
多个 @SuppressWarnings(value={"all","path"})
public class Demo{
public static void run(){
List list = new ArrayList();
// 此时会有 “ Raw use of parameterized class 'List' ” 的警告
}
}
public class Demo{
@SupperWarings("all")
public static void run(){
// 此时警告解除
List list = new ArrayList();
}
}
2. 元注解
元注解是用于注解的注解,在JDK 1.5中提供了4个标准的用来对注解类型进行注解的注解类
@Target注解:用来描述注解的使用范围,即注解可以使用在什么地方,在定义注解的时候使用这个我们可以更加清晰的知道它的使用范围。
public enum ElementType {
TYPE, //类,接口
FIELD, //成员变量
METHOD, //方法
PARAMETER, //方法参数
CONSTRUCTOR, //构造方法
LOCAL_VARIABLE, //局部变量
ANNOTATION_TYPE, //注解类
PACKAGE, // 包
TYPE_PARAMETER, //类型参数
TYPE_USE //使用类型的任何地方
}
@Retention注解:表示这个注解在什么时候还有效 , 用于描述注解的生命周期
源程序阶段(Source)——xx.java/ xx.class阶段。
类对象阶段(Class)——程序文件被加载到方法区里。
运行时阶段(Runtime)
public enum RetentionPolicy {
SOURCE, // 源文件保留
CLASS, // 编译期保留,默认值
RUNTIME // 运行期保留,可通过反射去获取注解信息,咱们自定义的类一般使用这个
}
小小的例子
@MyAnnotation// 在方法上使用,此处会报错
public class Demo{
@MyAnnotation
public static void run(){
System.out.println("------");
}
public static void main(String[] args){
run();
}
}
@Retention(value = RetentionPolicy.RUNTIME)// 运行期间保留
@Target(value = {ElementType.METHOD})// 作用在方法上面
@interface MyAnnotation{}
@Documented:只是用来标注生成javadoc的时候是否会被记录(了解就好)。
public class Demo{
@MyAnnotation
public static void run(){
System.out.print("------");
}
public static void main(String[] args){
run();
}
}
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD})
@Documented
@interface MyAnnotation{
}
@Inherited:使被它修饰的注解具有继承性
3. 自定义注解
@interface是用来声明一个注解的,格式public @interface 注解名{定义内容};
其中的每一方法实际上是声明了一个配置参数;
方法的名称就是参数的名称;
返回值类型就是参数的类型(返回值类型只能是基本数据类型,Class,String,enum);
可以通过default来声明参数的默认值;
如果只有一个参数成员,一般参数名称为value;
注解参数必须有值,我们自定义注解元素时,经常使用空字符串,0作为默认值;
public class Demo{
@MyAnnotation() // 定义了参数,不写参数会报错
public void run(){
System.out.print("--------");
}
}
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value ={ElementType.METHOD,ElementType.TYPE})
@interface MyAnnotation{
// 注解的参数:参数类型+ 参数名()
String name();
}
public class Demo{
@MyAnnotation()// 设置了默认参数,不必加参
public void run(){
System.out.print("------");
}
}
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value ={ElementType.METHOD,ElementType.TYPE})
@interface MyAnnotation{
// 注解的参数:参数类型+ 参数名()
String name() default "hello";
}
public class Demo{
@MyAnnotation(name = "goose")
// 如果有默认值,我们可以赋值也可以不赋值
// 如果没有默认值,那么必须给注解值
public void run(){
System.out.print("------");
}
}
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value ={ElementType.METHOD,ElementType.TYPE})
@interface MyAnnotation{
// 注解的参数:参数类型+ 参数名()
String name() default "hello";
}
public class Demo{
@MyAnnotation("goose")
// 此处可以不写name ="xxx"
// value可以默认不写
public void run(){
System.out.print("------");
}
}
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value ={ElementType.METHOD,ElementType.TYPE})
@interface MyAnnotation{
// 注解的参数:参数类型+ 参数名()
String name();
}
三、注解实现
1. 自定义注解实现类
@Retention(RetentionPolicy.RUNTIME) //元注解:定义自定义注解的生命周期 ---》在运行期间保留
@Target(value = {ElementType.TYPE}) //元注解:定义自定义注解的作用返回 ---》只能作用在类上边
public @interface WebServlet {
String urlMapping() default "";
}
2. 在一个类上使用注解
@WebServlet(urlMapping = "/third")
public class ThridServlet {
}
3. 利用反射获取注解信息
//利用反射获取注信息
public static void getMessage() throws Exception {
Class clazz = Class.forName("com.qcby.MyServletDemo.FirstServlet");
//获取注解信息
WebServlet webServlet = (WebServlet) clazz.getDeclaredAnnotation(WebServlet.class);
System.out.println(webServlet.urlMapping());
}
public static void main(String[] args) throws Exception {
getMessage();
}
标签:Java,自定义,void,value,class,参数,注解,public
From: https://blog.csdn.net/m0_75260099/article/details/144334416