注解的使用与自定义注解

注解

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() ; //name属性
    //基本数据类型
    int age() ; // age属性
    //枚举类型
    MyEnum direction() ;//direction
    //注解类型
    MyAnno2 value() ;//value属性
    //以上类型的数组格式
    String[] strs() ;//strs属性
}

public @interface MyAnno2 {
    String value() ;//value属性
}

public enum MyEnum {
    //常量
    FRONT,
    RIGHT,
    BEHIND,
    LEFT;
}

public class Person {
    public void show(){
        System.out.println("show person...");
    }
}

//工人类继承人类
//给worker去使用  @MyAnno
    //使用某一个注解,那么要给注解中的所有的属性赋值
@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....");
    }
    //@Override报错
    @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) //@MySelfAnno就可以作用在类上
@Retention(RetentionPolicy.RUNTIME) //@MySelfAnno保留在运行阶段 (一般自定义注解:设计层面,考虑运行阶段)
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 {
        //解析当前类Test上的 @MySelfAnno注解
        //1)获取当前类的字节码文件对象
        Class  testClass = Test.class ;
        //2)当前类的Class类对象获取注解的实例
        //public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
        // 参数:表示当前注解类型的Class
        //获取的公共接口Annotation--->向下转型 具体的注解类型
        MySelfAnno annotation = (MySelfAnno) testClass.getAnnotation(MySelfAnno.class);
        /**
         * public interface MySelfAnno{
         *     String className() ;
         *     String methodName() ;
         * }
         
         * public class XXX implements MySelfAnno{
         *     重写了
         *     public String className(){
         *         return "com.qf.annotation_03.Student" ;
         *     }
         *     public String methodName(){
         *
         *         return "love" ;
         *     }
         * }//子类
         */
        String className1 = annotation.className();
        String methodName1 = annotation.methodName();

        //继续反射
        Class clazz1 = Class.forName(className1);
        //创建当前类实例
        Object clazzObj = clazz1.newInstance();

        //获取当期类的Method
        Method method1 = clazz1.getMethod(methodName1);
        method1.invoke(clazzObj) ;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值