Java注解

来源:互联网 发布:同济启明星软件价格 编辑:程序博客网 时间:2024/06/05 08:41

1. 简介
注解,java中提供了一种原程序中的元素关联任何信息、任何元素的途径的途径和方法。注解是那些插入到源代码中使用其他工具可以对其进行处理的标签。注解不会改变程序的编译方式。java编译器会对包含注解与不包含注解的代码生成相同的虚拟机指令。
2. 常用注解
@Override: 修饰重载父类方法;
@Deprecated: 修饰未来将被抛弃的类/方法/属性等等;
@SuppressWarnings: 关闭不当编译器警告信息。
3. 注解运行机制分类
源码注解: 注解只在源码中存在,编译成.class文件中不存在;
编译时注解: 注解存在于源码与.class中,运行时不存在;
运行时注解: 在所有阶段都存在,可以影响程序运行逻辑。
4. 注解来源分类
来自jdk的注解:如@Override/@Deprecated等等;
三方的注解: 如junit中的@Test/@Before等等;
自定义注解: 通过元注解自定义的注解。
5. 元注解
给注解进行注解,用于自定义注解。
@Target: 指明定义的注解的作用域,其值包括:
ElementType.CONSTRUCTOR: 构造方法声明;
ElementType.FIELD: 属性/字段声明;
ElementType.LOCAL_VARIABLE: 局部变量声明;
ElementType.METHOD: 方法声明;
ElementType.PACKAGE: 包声明;
ElementType.PARAMETER: 参数声明;
ElementType.TYPE: 类接口声明;
ElementType.ANNOTATION_TYPE: 注解类型声明;
ElementType.TYPE_PARAMETER: 类型参数声明(@since 1.8);
ElementType.TYPE_USE: 类型使用(@since 1.8)

@Retention: 自定义注解的生命周期,其值包括:
RetentionPolicy.SOURCE: 只在源码显示,编译时丢弃;
RetentionPolicy.CLASS: 编译时记录到.class中,运行时忽略;
RetentionPolicy.RUNTIME: 运行时存在,可通过反射来读取。

@Inherited: 一个标记注解,阐述了某个被标注的类型是被继承的,只能继承与类。

@Documented: 用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
6. 自定义注解

//@Target(ElementType.METHOD)@Target({ElementType.METHOD,ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface Description {    String desc() default "";    String author() default "";    int age() default 18;}

1.使用关键字@interface定义注解;
2.成员变量以无参无异常的方式声明;
3.可以通过default关键字给成员变量指定默认值;
4.成员变量的类型是受限制的,包括原始类型、String、Class、Annotation、Enumeration;
5.如果注解只有一个成员变量,则成员名称必须取名value(),在使用中可以忽略成员名称与赋值号(=);
6.注解可以没有成员,没有成员的注解称为标示注解。

/***********注解声明***************//** * 水果名称注解 * @author peida * */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitName {    String value() default "";}/** * 水果颜色注解 * @author peida * */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitColor {    /**     * 颜色枚举     * @author peida     *     */    public enum Color{ BULE,RED,GREEN};    /**     * 颜色属性     * @return     */    Color fruitColor() default Color.GREEN;}/** * 水果供应者注解 * @author peida * */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitProvider {    /**     * 供应商编号     * @return     */    public int id() default -1;    /**     * 供应商名称     * @return     */    public String name() default "";    /**     * 供应商地址     * @return     */    public String address() default "";}/***********注解使用***************/public class Apple {    @FruitName("Apple")    private String appleName;    @FruitColor(fruitColor=Color.RED)    private String appleColor;    @FruitProvider(id=1,name="陕西红富士集团",address="陕西省西安市延安路89号红富士大厦")    private String appleProvider;    public void setAppleColor(String appleColor) {        this.appleColor = appleColor;    }    public String getAppleColor() {        return appleColor;    }    public void setAppleName(String appleName) {        this.appleName = appleName;    }    public String getAppleName() {        return appleName;    }    public void setAppleProvider(String appleProvider) {        this.appleProvider = appleProvider;    }    public String getAppleProvider() {        return appleProvider;    }    public void displayName(){        System.out.println("水果的名字是:苹果");    }}/***********注解处理器***************/public class FruitInfoUtil {    public static void getFruitInfo(Class<?> clazz){        String strFruitName=" 水果名称:";        String strFruitColor=" 水果颜色:";        String strFruitProvicer="供应商信息:";        Field[] fields = clazz.getDeclaredFields();        for(Field field :fields){            if(field.isAnnotationPresent(FruitName.class)){                FruitName fruitName = (FruitName) field.getAnnotation(FruitName.class);                strFruitName=strFruitName+fruitName.value();                System.out.println(strFruitName);            }            else if(field.isAnnotationPresent(FruitColor.class)){                FruitColor fruitColor= (FruitColor) field.getAnnotation(FruitColor.class);                strFruitColor=strFruitColor+fruitColor.fruitColor().toString();                System.out.println(strFruitColor);            }            else if(field.isAnnotationPresent(FruitProvider.class)){                FruitProvider fruitProvider= (FruitProvider) field.getAnnotation(FruitProvider.class);                strFruitProvicer=" 供应商编号:"+fruitProvider.id()+" 供应商名称:"+fruitProvider.name()+" 供应商地址:"+fruitProvider.address();                System.out.println(strFruitProvicer);            }        }    }}/***********输出结果***************/public class FruitRun {    /**     * @param args     */    public static void main(String[] args) {        FruitInfoUtil.getFruitInfo(Apple.class);    }}
原创粉丝点击