JAVA基础————两分钟看懂注解Annotation

本文介绍Java注解的基础概念,包括其定义、作用及使用场景。通过一个具体的访问控制案例,展示了如何自定义注解并利用反射机制在运行时读取注解信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JAVA基础————两分钟学会注解Annotation

title: JAVA基础————两分钟看懂注解Annotation
date: 2015-12-26 23:05:46
categories: 专题
tags: [java基础,注解,annotation]


什么是注解

注解是一种描述程序的元数据 1,我们可以把他当做一种特殊的注释 

官方文档2 : Annotations, a form of metadata, provide data about a program that is not part of the program itself. 

  • 注解可以为编译器提供信息,如@Override,@SuppressWarnings
  • 可以代替xml等文件,为程序保存所需的配置
  • 可以在程序运行时根据注解执行一些操作,如Spring中的@Autowired

注解的语法

声明注解

注解的定义与接口类似,也可以为注解添加属性。在实现注解时,方法名是对象属性名,返回值是属性值的类型。如 @Override的定义:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override{}

自定义并实例化注解:

@interface Developer{
  String [] name();
  int level() default 0;
}
//一个注解对象
@Developer(name={"j","p"},level=2)

内置注解

java提供几个内置注解来描述自定义的注解
@Target:应用到什么对象

名称定义
ElementType.ANNOTATION_TYPE应用于注解
ElementType.FIELD属性
ElementType.METHOD方法
ElementType.TYPE类的任何元素
…更多内容…更多内容

@Retention:注解存储的位置

名称定义
RetentionPolicy.SOURCE保留在源码阶段,被编译器忽略
RetentionPolicy.CLASS保留至编译阶段,被JVM忽略
RetentionPolicy.RUNTIME保留至JVM可以在运行时使用

@Inherited
类的注解默认不会被继承给子类,如果需要应该在定义时指定@Inherited(只适用于一个类的注解)

@Document :

如果定义注解时指定@Document那么注解会被添加到用用对象的javadoc文档中

使用注解

我们已经了解了注解的基本语法,那么应该怎么在程序中处理注解呢?

举个例子

     假设公司办公楼里有不同类型的一些房间,而每天都会有各种身份的人来公司,如何让程序来控制这些人对不同房间的访问权限呢?


     
通常我们会将权限关系保存在xml等文件中,但同时也可以使用注解来保存各类房间允许进入的人员信息,并在程序中根据注解作出处理。

1.定义房间:

public class Room {
    public void open(String name){
        System.out.println(name+" came in");}
    }
}

2.创建注解时选择RETENTION.RUNTIME,这样我们可以通过反射获取注解信息:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Accessible {
    //保存允许进入房间的人员
    String [] value ();
}

3.创建WashRoom,MeetingRoom,BossRoom,并在open方法上添加注解:

//例:洗手间 任何人都可以进入
public class WashRoom extends Room {
    @Accessible({"Boss","Staff","Visitor"})
    @Override
    public void open(String name){
        System.out.println("this is washroom");
        super.open(name);
    }
}

4.处理注解:

//初始化房间和人员
Room[] rooms = {new WashRoom(), new MeetingRoom(), new BossRoom()};
String[] persons = {"Boss", "Staff", "Visitor"};

for (String person : persons) {
    for (Room room : rooms) {

        Method[] methods = room.getClass().getMethods();

            for (Method method : methods) {
                //用反射获取带有注解的方法
                if (method.isAnnotationPresent(Accessible.class)) {
                    Accessible accessAnnotation = method.getAnnotation(Accessible.class);
                    //获得注解内容
                    List<String> nameList = Arrays.asList(accessAnnotation.value());
                    if (nameList.contains(person)) {
                        try {
                            method.invoke(room, person);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } else {
                            System.out.println("forbidden!");
                        }
                    }
                }
            }
        }

全文完~

参考

oracle java文档:https://docs.oracle.com/javase/tutorial/java/annotations/index.html
Java深度历险(六)——Java注解 http://www.infoq.com/cn/articles/cf-java-annotation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值