Java基础-注解
标签:Java基础

注解

注解是JDK1.5 引入的,Java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法。

@Override

@Deprecated

@Suppresswarnings

1. 注解的分类

按照运行机制分:

按照来源分:

注解的注解叫做元注解。

2. 自定义注解

2.1 自定义注解语法要求

下面是一个示例:

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

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description{
    String desc();

    String author();

    int age() default 18;
}

要点:

上面示例中的这些称为元注解

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented

2.2 使用自定义注解

@<注解名>(<成员名1>=<成员值1>,<成员名2>=<成员值2>,...)

利用上面的注解有:

@Description(desc="eye",author="liuyao",age=18)
public String eyeColor(){
    return "red";
}

3. 解析注解

通过反射获取类,函数或成员上的运行时注解信息,从而实现动态控制程序运行时的逻辑。

Description:注解类

package com.liuyao;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * Created By liuyao on 2018/5/6 23:26.
 */

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description{
   String value();
}

Child

package com.liuyao;

/**
 * Created By liuyao on 2018/5/6 23:27.
 */
@Description("Class Description")
public class Child {
    @Description("Method Description")
    public void test(){

    }
}

ParseAnn:解析注解

package com.liuyao;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

/**
 * Created By liuyao on 2018/5/6 21:19.
 */
public class ParseAnn {
    public static void main(String[] args) {
        try {
//            1.使用类加载器加载类
            Class c=Class.forName("com.liuyao.Child");
//            2.找到类上面的注解
            boolean isExist=c.isAnnotationPresent(Description.class);
            if (isExist){
//                3.拿到注解实例
                Description description= (Description) c.getAnnotation(Description.class);
                System.out.println(description.value());

//                4.找到方法上的注解
                Method[] ms=c.getMethods();
                for (Method m : ms) {
                    boolean isMExist=m.isAnnotationPresent(Description.class);
                    if (isMExist){
                        Description description1=(Description) m.getAnnotation(Description.class);
                        System.out.println(description1.value());
                    }
                }
//                另一种解析方法
                for (Method m:ms) {
                    Annotation[] as=m.getAnnotations();
                    for (Annotation a : as) {
                        if (a instanceof Description){
                            Description d= (Description) a;
                            System.out.println(d.value());
                        }
                    }
                }
            }


        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

  • 3 min read

CONTRIBUTORS


  • 3 min read