Thinking in Java (9)

第十九章 枚举类型

第二十章 注解

enum 枚举类

默认继承java.lang.Enum,可以实现多个接口,枚举类的构造器修饰符private,枚举类的实例在枚举类的第一行显示列出

public enum Season implements Description{

    // Season的实例
    SPRING("春"){
        @Override
        public void info() {
            System.out.println("spring:春");
        }
    },
    SUMMER("夏"){
        @Override
        public void info() {
            System.out.println("summer:夏");
        }
    },
    FALL("秋"){
        @Override
        public void info() {
            System.out.println("fall:秋");
        }
    },
    WINTER("冬"){
        @Override
        public void info() {
            System.out.println("winter:冬");
        }
    };

    private String alias;

    private Season(String alias) {
        this.alias = alias;
    }

    public String getAlias() {
        return alias;
    }



    public static void main(String[] args) {
        // 枚举类实例的名称
        System.out.println(SPRING.name());
        // 枚举值的索引值
        System.out.println(SUMMER.ordinal());
        // 枚举常量的名称与name方法相似
        System.out.println(FALL.toString());
        // 获取指定名称的枚举值
        System.out.println(Season.valueOf("WINTER"));
        // 获取所有枚举值
        Season[] seasons = Season.values();
        for (Season season : seasons) {
            System.out.println(season.getAlias());
        }

        WINTER.info();
    }

    @Override
    public void info() {
        System.out.println("season:季节");
    }
}

//output:
SPRING
1
FALL
WINTER
春
夏
秋
冬
winter:冬

注解

从JDK5开始,java增加了对元数据的支持,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,注解不影响代码的执行。

5个基本注解:

@Override   指定覆盖方法

@Deprecated   表示某个程序元素已过时

@SuppressWarnings   指示被该注解修饰的元素取消显示指定的编译器警告

@SafeVarargs   

@FunctionalInterface   指定某个接口为函数式接口

JDK的元注解(注解的注解)

@Retention  用于指定被修饰的注解可以保留多久

@Retention(RetentionPolicy.CLASS) 

注解记录在class文件中,运行程序时JVM不可获取注解信息

@Retention(RetentionPolicy.RUNTIME)

注解记录在class文件中,运行程序时JVM可以获取注解信息

@Retention(RetentionPolicy.SOURCE)

注解只记录在源代码中

@Target   用于修饰注解可应用于的程序单元

ElementType.ANNOTATION_TYPE  用于描述注解
ElementType.CONSTRUCTOR  用于描述构造器 
ElementType.FIELD   用于描述域 
ElementType.LOCAL_VARIABLE   用于描述局部变量 
ElementType.METHOD   用于描述方法 
ElementType.PACKAGE   用于描述包 
ElementType.PARAMETER   用于描述参数 
ElementType.TYPE   用于描述类、接口(包括注解类型) 或枚举定义

@Documented

@Documented用于指定被该元注解修饰的注解类将被 javadoc工具提取成文档

@Inherited

指明被修饰的注解具有继承性,某个类被@Xxx注解(该注解被@Inherited修饰),则其子类自动被@Xxx修饰

##############################

根据注解是否包含成员变量分为:

标记注解:无成员变量                 

元数据注解:包含成员变量        

##############################

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Test{

    // 定义名为name的成员变量,并指定默认值
    public abstract String name() default "class";
}


@Test(name="main")
public class Main{

}

利用反射提取注解信息

Annotation接口代表程序元素前面的注解,AnnotatedElement接口代表程序中可以接受注解的元素

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Test {
    String name() default "method";
}
public class Main {
    @Test(name="info")
    public void info(){}
    public static void main(String[] args) throws Exception{
        Annotation[] array = Main.class.getMethod("info").getAnnotations();
        for (Annotation annotation:array) {
            System.out.println(((Test)(annotation)).name());
        }
    }
}
//output:
info

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值