Java注解

  • 就是Java代码里的特殊标记,作用是:让其他程序根据注解信息来决定怎么执行程序
  • 注意:注解可以用在类上、构造器、方法、成员变量、参数

一、自定义注解

java 复制代码
/*
自定义注解
 */
public @interface MyTest1 {
    String aaa();
    boolean bbb() default true;
    String[] ccc();
}

特殊属性名:value

java 复制代码
public @interface MyTest2 {
    String value(); //特殊属性
    int age() default 23;

}
java 复制代码
@MyTest1(aaa="xyy",ccc={"HTML", "Java"})
//@MyTest2(value = "swk",age = 1000)
@MyTest2(value = "swk")
public class AnnotationTest1 {
    @MyTest1(aaa="cxk",bbb=false,ccc={"Python" , "前端" ,"Java"})
    public void test1(){
    }

    public static void main(String[] args) {

    }
}

二、元注解

  • 修饰注解的注解
java 复制代码
@Target({ElementType.TYPE,  ElementType.METHOD}) //当前被修饰注解只能用在类、方法上
@Retention(RetentionPolicy.RUNTIME) //控制下面的注解一直保留到运行时
public @interface MyTest3 {

}

三、什么是注解的解析?

  • 就是判断类上、方法、成员变量上是否存在注解,并把注解里的内容解析出来

如何解析注解?

注解MyTest4

java 复制代码
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest4 {
    String value();
    double aaa() default 100;
    String[] bbb();


}

Demo类

java 复制代码
MyTest4(value = "猪猪侠",aaa = 99.5,bbb = {"超人强","小呆呆"})
public class Demo {
    @MyTest4(value = "迷糊老师",aaa = 199.5,bbb = {"菲菲公主","GGBOND"})
    public void test1(){

    }

}
java 复制代码
/**
 * 目标:掌握注解的解析
 */
public class AnnotationTest3 {
    @Test
    public void parseClass(){
        //1.先得到Class对象
        Class<Demo> c = Demo.class;
        //2.解析类上的注解
        //判断类上是否包含了某个注解
        if(c.isAnnotationPresent(MyTest4.class)){
            MyTest4 myTest4
                    = c.getDeclaredAnnotation(MyTest4.class);
            System.out.println(myTest4.value());
            System.out.println(myTest4.aaa());
            System.out.println(Arrays.toString(myTest4.bbb()));
        }
    }

    @Test
    public void parseMethod() throws NoSuchMethodException {
        //1.先得到Class对象
        Class<Demo> c = Demo.class;
        Method m = c.getDeclaredMethod("test1");
        //2.解析方法上的注解
        //判断方法上是否包含了某个注解
        if(m.isAnnotationPresent(MyTest4.class)){
            MyTest4 myTest4
                    = m.getDeclaredAnnotation(MyTest4.class);
            System.out.println(myTest4.value());
            System.out.println(myTest4.aaa());
            System.out.println(Arrays.toString(myTest4.bbb()));
        }

    }


}

四、注解应用场景

java 复制代码
public class AnnotationTest4 {
//    @MyTest
    public void test1(){
        System.out.println("===test1===");
    }
    @MyTest
    public void test2(){
        System.out.println("===test2===");
    }
//    @MyTest
    public void test3(){
        System.out.println("===test3===");
    }
    @MyTest
    public void test4(){
        System.out.println("===test4===");
    }

    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
        AnnotationTest4 a = new AnnotationTest4();
        //启动程序!
        //1.得到Class对象
        Class<AnnotationTest4> c = AnnotationTest4.class;
        //2.提取这个类中的全部成员方法
        Method[] methods = c.getDeclaredMethods();
        //3.遍历数组,看方法上是否存在@MyTest注解
        for (Method method : methods) {
            if(method.isAnnotationPresent(MyTest.class)){
                //说明当前方法上是存在@MyTest,触发当前方法执行
                method.invoke(a);
            }
        }
    }
}

//MyTest注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {

}
相关推荐
blue_ice .7 分钟前
Verilog DDS 数字信号发生器:DAC 输出模拟波形与 ADC 回采观测
开发语言·单片机·嵌入式硬件·fpga开发
远翔调光芯片^1382879887237 分钟前
ECP5702能芯科技PD取电芯片在市场上的优势有哪些?
开发语言·人工智能·单片机·嵌入式硬件·智能家居
西峰u1 小时前
Java单例模式|从基础到多线程安全
java·java单例模式
ClinicTech1 小时前
实验室洗瓶机的清洗系统架构与自动化控制解析
java·python
linmengmeng_13141 小时前
【总结】MyBatis-Plus批量插入与清表的正确姿势
java·spring boot·mysql·mybatis
木井巳1 小时前
【记忆化搜索】不同路径
java·算法·leetcode·深度优先·剪枝·推荐算法
Sam_Deep_Thinking1 小时前
new Thread()之后发生了什么?
java·后端·面试·程序员
泡海椒1 小时前
规则引擎对比:JQuick-Java vs Drools 轻量场景选型对比
java·开发语言
wno7042 小时前
Spring Security短信验证码登录
java·python·spring
泡泡鱼(敲代码中)2 小时前
Python 容器类型学习笔记:列表、元组、字典、集合
开发语言·笔记·python·pycharm