自定义注解需要注意地方和元注解的使用

自定义注解需要注意地方和元注解的使用,第1张

自定义注解需要注意地方和元注解的使用 介绍:

Annotation表示注解,是JDK1.5的新特性

JDK中常见的注解:

@Override
表示重写方法

@Deprecated
表示过时的方法

@SuppressWarnings("all"):
压制警告

自定义注解(了解)

public @interface MyAnnotation {
    public static final int num1 = 100;
    public static final String num2 = "abc";
    public static final MyAnno num3 = null;
    public static final Class num4 = String.class;
    public static final int[] num5 = {};

    public abstract String show1() default "show1";
    public abstract int show2() default 132;
    public abstract MyAnno2 show3() default @MyAnno2;
    public abstract Class show4() default String.class;
    public abstract int[] show5() default {1, 2, 3};
}

其中注解中的属性类型 可以是:

  • 基本数据类型

  • String

  • Class

  • 注解

  • 枚举

  • 以上类型的一维数组

    而且注解与我们定义接口有点像,可以用定义接口时候的思维去定义注解,但是我们注解中属性类型不能是void,只是用接口的思维,前期学习理解,但是两者毕竟还是2个东西。

例如我们定义接口

public @interface MyAnno {
    int num1 = 100;
    String num2 = "abc";
    MyAnno num3 = null;
    Class num4 = String.class;
    int[] num5 = {};

    String show1() default "123";
    int show2() default 132;
    MyAnno2 show3() default @MyAnno2;
    Class show4() default String.class;
    int[] show5() default {1, 2, 3};
}

下面是我们自定义基本注解的基本使用情况:

1、下面AnnoTest类中show2方法报错的地方,是因为我注解声明的时候声明了2个属性,但是我在用的时候只为一个注解赋值了。 2、如果声明注解属性的时候,声明了数组,如果审数组元素的个数为1个,那么可以不添加大括号:{}.

3、如果注解中只有一个属性,且声明的时候就给了默认值,那么在使用的时候,不会再强制赋值,就不用手动给出了


4、特殊属性名称value

在属性名称为value时候,可以不用写属性名称,

了解

元注解:
@Target:可以指定注解在哪里进行使用(例如类上、方法上、成员属性、方法参数等)

@Retention:
只能放在注解上面进行使用
可以定义一个注解的声明周期

综合案例:
我希望被我自定义注解所标识的方法才能运行(注解+反射实现),不被标记的方法不运行
,注解是给虚拟机和程序看的,不是给人看的。

自定义注解代码:
package com.ligong.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//注解所能标记的地方
@Target(value=ElementType.METHOD)
//注解的声明周期
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
}
测试类
package com.ligong.annotation;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class MyTestDemo {
    public void show1(){
        System.out.println("show3.....................");
    }
    @MyTest
    public void show2(){
        System.out.println("show2..........");
    }
    @MyTest
    public void show3(){
        System.out.println("show3..........");
    }

    public static void main(String[] args) throws Exception {
    //通过反射获取测试类的实例
        Class clazz = Class.forName("com.ligong.annotation.MyTestDemo");
        //获取无参构造方法
        Constructor constructor = clazz.getConstructor();
        //创建测试类的对象
        Object o = constructor.newInstance();
         //获取成员方法集合,公共的方法
        Method[] methods = clazz.getMethods();

        for (Method method : methods) {
        //如果这个方法被我的MyTest注解所标记,那么就运行这个方法
          if (method.isAnnotationPresent(MyTest.class)){
              method.invoke(o);
          }
        }
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5695247.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存