美文网首页互联网科技我爱编程java自学
「Java」你知道我们常使用的Java注解,是怎么实现的吗

「Java」你知道我们常使用的Java注解,是怎么实现的吗

作者: 糖宝_ | 来源:发表于2018-07-26 09:12 被阅读4次

注解相当于是标记,它与注释的区别在于注解的内容可以可以使用,下面,让我们认识下Java的注解。

要使用注解,我们可以分成三个部分,分别是:注解本身、注解使用类、注解处理类,如下图:

注解的结构

下面,我们看看代码怎么操作吧

第一步:新建注解

新建两个注解,分别是PlayerName与PlayerInfor

PlayerName:

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.FIELD)

@Documented

public @interface PlayerName {

String value() default "";

}

PlayerInfor:

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.FIELD)

@Documented

public @interface PlayerInfor {

public enum Color{Blue,Red,White};

Color color() default Color.Blue;

int number() default 7;

int age();

String club() default "曼彻斯特联队";

}

第二步:定义实体类,并且使用刚刚新建的注解

新建一个FootballPlayer类

FootballPlayer:

public class FootballPlayer {

//将PlayerName注解绑定在实体类的name属性中

@PlayerName("鲁尼")

public String name;

//将PlayerInfor注解绑定在实体类的playInfo属性中

@PlayerInfor(color=Color.Red,number=10,age=30)

public String playInfo;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPlayInfo() {

return playInfo;

}

public void setPlayInfo(String playInfo) {

this.playInfo = playInfo;

}

}

第三步:定义注解处理类,处理实体类的注解

新建AnnoUtil工具类

AnnoUtil:

import java.lang.reflect.Field;

public class AnnoUtil {

public static void getPlayerInfo(Class clazz){

/*获取实体类的所有属性*/

Field[] fields = clazz.getFields();

//循环抽取实体类属性中的注解

for(Field field:fields){

//匹配注解

if(field.isAnnotationPresent(PlayerName.class)){

//获取注解

PlayerName name = field.getAnnotation(PlayerName.class);

//使用注解

System.out.println("运动员名字:"+name.value());

}else if(field.isAnnotationPresent(PlayerInfor.class)){

//获取注解

PlayerInfor infor = field.getAnnotation(PlayerInfor.class);

//使用注解

System.out.println("所属球队:"+infor.club()+",代表颜色:"

+infor.color()+",号码:"+infor.number()+",年龄:"+infor.age());

}

}

}

}

第四步:调用处理类的处理方法

public static void main(String[] args) {

AnnoUtil.getPlayerInfo(FootballPlayer.class);

}

输出结果如下:

运动员名字:鲁尼

所属球队:曼彻斯特联队,代表颜色:Red,号码:10,年龄:30

从以上程序可以理解为:实体类与注解的关系就像文章与笔记,而注解处理类就像是人;人读了带有笔记的文章,加以分析处理,输出想要表达的结果。

附:

Java中提供了四种元注解,专门负责注解其他的注解,分别如下

@Retention元注解,表示需要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包括:

RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉

RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认)

RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息

@Target元注解,默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括

ElementType.CONSTRUCTOR: 构造器声明

ElementType.FIELD: 成员变量、对象、属性(包括enum实例)

ElementType.LOCAL_VARIABLE: 局部变量声明

ElementType.METHOD: 方法声明

ElementType.PACKAGE: 包声明

ElementType.PARAMETER: 参数声明

ElementType.TYPE: 类、接口(包括注解类型)或enum声明

@Documented将注解包含在JavaDoc中

@Inheried允许子类继承父类中的注解

 我刚整理了一套2018最新的0基础入门和进阶教程,无私分享,加Java学习裙 :678-241-563 即可获取,内附:开发工具和安装包,以及系统学习路线图。

相关文章

  • 「Java」你知道我们常使用的Java注解,是怎么实现的吗

    注解相当于是标记,它与注释的区别在于注解的内容可以可以使用,下面,让我们认识下Java的注解。 要使用注解,我们可...

  • 一个简单的自定义注解

    1、定义一个自定义注解 2、使用注解 3、利用反射获取注解的值 java注解是怎么实现的?

  • Java注解的使用

    Java注解的使用 参考 廖雪峰java教程 使用注解 什么是注解(Annotation)?注解是放在Java源码...

  • java 中的注解

    java 中的注解 使用的时候可以参考秒懂,Java 注解 (Annotation)你可以这样学 Java 注解用...

  • Java中的注解&反射

    注解 注解声明 声明一个注解类型 Java中所有的注解,默认是实现Annotation接口: 注解的声明使用@in...

  • JVM JRE JDK JIT之间的区别

    java虚拟机(JVM) 使用java编程语言的主要优势就是平台的独立性。你曾经想知道过java怎么实现平台的...

  • 自定义注解

    java annotation基础 java注解分为标准注解和元注解。 标准注解是java为我们提供的预定义的注解...

  • Java 注解(四)注解与反射

    注解与反射机制前面经过反编译后,我们知道Java所有注解都继承了Annotation接口,也就是说Java使用An...

  • java 注解(annotation)

    java 注解(annotation) Java 5.0 版本之后引入注解,至此就被广泛使用。 何为注解 什么是注...

  • 注解反射动态代理的简单学习

    一.注解 java中注解默认实现annotation接口,一般我们自定义注解的时候主要使用的是两个元注解(其他两个...

网友评论

    本文标题:「Java」你知道我们常使用的Java注解,是怎么实现的吗

    本文链接:https://www.haomeiwen.com/subject/inyvmftx.html