注解
1.注解:Java中针对 类的编译,加载,运行时提供一种特殊的代码标记
可以被解析-----就是通过反射实现的
注解的本质就是一个接口
2.普通注解
@Override:一般方法中使用,标记这个方法是否是重写方法
@SupressWarning:压制警告 (项目部署上线的时候,项目中不能出现黄色警告线)
@Deprecated:标记方法已经过时
@FunctionalInterface:标记某个接口是否为函数式接口
接口中有且仅有一个抽象方法
3.元注解
@Target:当前这个注解能够使用的范围
ElementType[] value(); value属性("抽象方法名") 返回值枚举数组类型
ElementType 枚举中的都是常量字段 (等价于 public static final ....)
TYPE,能够使用在类上或者接口上
FIELD:能够使用在成员变量上
METHOD:能够使用在成员方法上
@Retention:标记当前这个某个注解保留的阶段
RetentionPolicy value(); value属性 它的返回值枚举类
RetentionPolicy
SOURCE 原码编译阶段
CLASS 类的加载,反射阶段
RUNTIME 类的运行阶段
注解(本质接口)中的方法名----- 称为"属性"
属性中可以是什么样的数据类型呢?
基本数据类型
String类型
枚举类型
注解类型
以上类型的数组格式
如果某个注解中有且只有一个属性,value
public @interface XXX{
String value() ;
}
在别的一些类上使用这个注解的时候,那么赋值value属性可以不写
@XXX(value=("hello"))
class Demo{}
public @interface MyAnno {
String name() ;
int age() ;
MyEnum direction() ;
MyAnno2 value() ;
String[] strs() ;
}
public @interface MyAnno2 {
String value() ;
}
public enum MyEnum {
FRONT,
RIGHT,
BEHIND,
LEFT;
}
public class Person {
public void show(){
System.out.println("show person...");
}
}
@MyAnno(name="高圆圆",age=20,direction = MyEnum.LEFT,value = @MyAnno2("hello"),strs = {"aaa","bbb","ccc"})
public class Worker extends Person {
@Override
public void show() {
System.out.println("show worker....");
}
@Deprecated
public void method(){}
}
4.自定义注解
1)自定义一个注解 @Annotation
2)在加上一些元注解,标记当前你自己的定义这个的@Target:作用的位置
@Retention:保留的阶段(Runtime,source,class)
3)如何解析自定义注解
反射的方式
public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
参数:表示当前注解类型的Class
public class Person {
public void show(){
System.out.println("show person...");
}
}
public class Student {
public void love(){
System.out.println("爱学习,爱Java");
}
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MySelfAnno {
String className() ;
String methodName() ;
}
@MySelfAnno(className ="com.qf.annotation_03.Worker",methodName = "love")
public class Test {
public static void main(String[] args) throws Exception {
Class testClass = Test.class ;
MySelfAnno annotation = (MySelfAnno) testClass.getAnnotation(MySelfAnno.class);
String className1 = annotation.className();
String methodName1 = annotation.methodName();
Class clazz1 = Class.forName(className1);
Object clazzObj = clazz1.newInstance();
Method method1 = clazz1.getMethod(methodName1);
method1.invoke(clazzObj) ;
}
}