java注解详解(一)

java注解详解(一)

java注解究竟是什么?有什么用处,一直听说这个,但是一直没看明白,今天一起来探究竟。
请先看这篇文章:

https://blog.csdn.net/baidu_36385172/article/details/79953410

我们知道了,注解其实就是一个标签。那么标签负责的用途不一样,比如@Override,很多同学觉得添加和不添加无所谓,如果是在代码正确的前提下,确实没有意义,但是如果平时写bug比较多的同学还是建议写一下,因为如果重写的时候添加注@Override,那么编译的时候编译器就会检查重写是否正确。
接下来我们看一下两个比较常用的注解。
在这里插入图片描述注解的属性可支持数据类型有如下:
1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
2.String类型
3.Class类型
4.enum类型
5.Annotation类型
6.以上所有类型的数组

@Target的类型有:

  • ElementType.CONSTRUCTOR 可以给构造方法进行注解
  • ElementType.FIELD 可以给属性进行注解(我们接下来要用滴!!)
  • ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
  • ElementType.METHOD 可以给方法进行注解
  • ElementType.PACKAGE 可以给一个包进行注解
  • ElementType.PARAMETER 可以给一个方法内的参数进行注解
  • ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
  • ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举

@Retention的类型有:
RetentionPolicy.RUNTIME:annotation将会被JVM保留,所以它们能在运行的时候被JVM或者是其他反射机制的代码进行读取和使用(我们接下来要用滴!!)
RetentionPolicy.CLASS:annotation编译时会被保留,在class文件中存在,但是不被JVM读取
RetentionPolicy.SOURCE:annotation只在源代码级别保留,编译后就会被忽略,不会保留在class文件中

了解上面这些概念之后,可能还是很模糊,不清楚到底该怎么用,那么请看下面这个例子,自己手动敲一遍吧。如果不清楚的可以看下面这篇文章哦。

https://blog.csdn.net/cool_summer_moon/article/details/80596510

下面给出代码:
自定义注解修饰属性,标注名字(String类型)

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//@Retention(RetentionPolicy.CLASS) //编译时会被保留,在class文件中存在,但是不被JVM读取
//@Retention(RetentionPolicy.SOURCE) //只在源代码级别保留,编译后就会被忽略,不会保留在class文件中
@Retention(RetentionPolicy.RUNTIME) //将会被JVM保留,所以它们能在运行的时候被JVM或者是其他反射机制的代码进行读取和使用
@Target(ElementType.FIELD)
public @interface Name {
    public String value() default "error";
}

自定义注解修饰属性,标注性别(enum类型)

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Sex {
    public enum GenderType{
        Male("男"), FeMale("女");
        private String genderStr;
        private GenderType(String arg0){
            this.genderStr=arg0;
        }
        @Override
        public String toString(){
            return this.genderStr;
        }

    }
    GenderType gender() default GenderType.Male;
}

定义测试工具类:

import java.lang.reflect.Field;

public class Testannotation {
    //@Name()  //不传参
    @Name(value = "Job")
    public String name;
    //@Sex()  //不传参
    @Sex(gender = Sex.GenderType.Male)
    public String sex;

    public static String getinfo(Class<?> cs) {
        Field[] declaredFields = cs.getDeclaredFields();
        String result="";
        for (Field field : declaredFields) {
            if (field.isAnnotationPresent(Name.class)) {
                Name annotation = field.getAnnotation(Name.class);
                String value = annotation.value();
                //String ss = annotation.ee();
                result+="\nname:"+value+"\n";
            }
            if(field.isAnnotationPresent(Sex.class)){
                Sex annotation = field.getAnnotation(Sex.class);
                String value = annotation.gender().name();  //打印“Male”
                //String value = annotation.gender().toString();  //打印“男”
                result+="\nsex:"+value+"\n";
            }
        }
        return result;
    }
    public static void main(String[] args){
        String name = getinfo(Testannotation.class);
        System.out.println(name);
    }
}

打印
在这里插入图片描述

今天就告一段落啦,明天再详细给大家整理一下吧,感谢关注。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值