注解
内置注解
自定义注解,元注解
什么是注解
Annotation是从JDK5.0开始引入的新技术.
Annotation的作用:
不是程序本身,可以对程序作出解释.(这一点和注释(comment)没什么区别)
可以被其他程序(比如:编译器等)读取。
Annotation的格式:
注解是以“@注释名"在代码中存在的,还可以添加一些参数,例如:@SuppressWarnings(value=“unchecked”)
Annotation在哪里使用?
可以附加在package,class, method, field 等上面,相当于给他们添加了额外的辅助信息,可以通过反射机制编程实现对这线元数据的访问
@Deprecated 不推荐使用,但可以使用
@Override 重写
@SuppressWarnings(“all”)镇压警告
什么是元注解
java.lang.annotation包中可以找到,java中有四个
//表示注解可以使用在哪些在哪些地方
@Target:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
//表示注解用在什么地方还有效果 runtime>source>class
@Retention:表示需要在说明级别保存该注解信息,用于描述注解的声明周记(SOURCE CLASS() RUNTIME)
//表示是否将注解生层在javaDoc中
@Document:说明该注解将被包含在javadoc中
//子类可以继承父类的注解
@Inherited:说明子类可以继承父类的注解
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Test03 {
//注解的参数 参数类型 + 参数名();
String name()default "";
int age()default 0;
int id()default -1;//如果默认值为-1表示可能不存在或者找不到
String[] school(){"西部开源","清华大学"};
}
注解如果没有默认值 default"", 就需要赋值,否则会报错
@Test03(name = “Tom”,age=18,id=1;school={“家里蹲”,“大学”}) //注解没有顺序 有default 可以不用写那个了
细节
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Test03 {
//注解的参数 参数类型 + 参数名();
String name()default "";
String value();
}
如果就一个value 可不用谢= 直接写参数 @Test03(“Tom”)
通过反射获取注解 构造方法之类的略了 跟之前类反射一样
package com.annotation;
import java.lang.reflect.Method;
/**
* @Author Tom
* @Date 2023/12/27 20:21
* @Description:
*/
@MisClass("TomClass")
public class Test {
@MisMethod("TomMethod1")
public static void tt1(){}
@MisMethod("TomMethod2")
public static void tt2(){}
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
//运用反射 获取类的注解
Class<?> aClass = Class.forName("com.annotation.Test");
MisClass annotation = aClass.getAnnotation(MisClass.class);
System.out.println(annotation.value());
//运用反射 获取方法的注解
Method tt1 = aClass.getMethod("tt1");
MisMethod annotation1 = tt1.getAnnotation(MisMethod.class);
System.out.println(annotation1.value());
}
}