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);
}
}
打印
今天就告一段落啦,明天再详细给大家整理一下吧,感谢关注。