Java 枚举、注解

1.枚举的特点

最重要的一个特点就是每一个枚举项都是一个对象!!!!,看一下代码,代码里详细解释

我的枚举类,好好看应该会有收获

public enum MyEnum {
    MAN("男"){
        @Override
        public String getName() {
            return this.name();
        }
    },WOMEN("女"){
        @Override
        public String getName() {
            return this.name();
        }
    };
    public String name;
    /**构造方法都是私有的无法公有,你可以试试*/
    MyEnum() {
    }

    MyEnum(String name) {
        this.name = name;
    }

    /**这边我定义一个抽象方法
     * 那么每个枚举项都要重写
     * */
    public abstract String getName();

}

我的测试方法

import java.util.concurrent.Executors;

public class TestEnum {
    public static void main(String[] args) {
        /**1.枚举类是Enum的字类
         * 2.使用和静态方法差不多直接点出来
         * 3.MAN和WOMEN都是对象
         * */
        System.out.println(MyEnum.MAN);
        //都是对象
        MyEnum myEnum = MyEnum.MAN;
        //枚举类里面可以有成员变量和无餐有参构造
        System.out.println("获取枚举的属性"+MyEnum.MAN.name);

        System.out.println("获取枚举的索引"+MyEnum.WOMEN.ordinal());

        System.out.println("返回索引的差值"+MyEnum.WOMEN.compareTo(MyEnum.MAN));

        System.out.println(MyEnum.MAN.toString());
        //类似java 反射的意思
        MyEnum man = Enum.valueOf(MyEnum.class, "MAN");

        System.out.println(man == MyEnum.MAN);
        //循环
        MyEnum[] values = MyEnum.values();
        for (MyEnum value : values) {
            System.out.println(value);
        }
    }
}

2.注解

相信大家都用过很多注解,或者看过很多注解

@Deprecated 标注的会是以过时的东西
@Override 重写方法
@SuppressWarnings("all") 压制警告等等!这边就不一一列举了

2.1 自定义注解

注解里面定义的类型可以是基本数据类型、String、Class、枚举、以及以上类型的一维数组。小小的演示一下,这边只写了一点点数据类型,没有写全,感兴趣的可以自己写写,然后特殊的属性就是value

public @interface MyAnno {
    String name() default "自定义的第一个注解";
    int age () default 26;
    int [] ages () default {1,2,3};

    String value();
}

@MyAnno(value = "11",name = "111")
//特殊属性value 不需要写前缀,如果只有一个value属性@MyAnno("11")
public class MyName {
}

2.2 对自定义注解进行操作

我们这边写一个@Mytest方法,我要运行有这个注解的方法。没有这个注解的方法我不运行

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MyRun {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        Class<?> myMethod = Class.forName("MyMethod");
        Method[] declaredMethods = myMethod.getDeclaredMethods();
        Constructor<?> constructor = myMethod.getConstructor();
        Object o = constructor.newInstance();
        for (Method declaredMethod : declaredMethods) {
            //主要就是这个方法可以判断这个方法上面是否有某个注解
            if(declaredMethod.isAnnotationPresent(MyTest.class)){
                declaredMethod.invoke(o);
            }

        }

    }
}


//这边是注解
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//注意这边要加上这个元注解
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
}


//这边是我的方法
public class MyMethod {
    @MyTest
    public String findMyName(){
        System.out.println("楼的花");
        return "楼的花";
    }


    @MyTest
    public int findMyAge(){
        System.out.println(18);
        return 18;
    }
}

2.4 元注解

元注解就是写在注解里面的注解,这边介绍三个元注解,我直接用代码实现

import java.lang.annotation.*;

//Target是规定这个注解能标注的地方
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
//这个表示注解可以传递给子类,如果父类有这个注解,即使子类没有引用这个注解,那么世界上子类头上也是有这个注解的
public @interface MyAnno {
    String name() default "自定义的第一个注解";
    int age () default 26;
    int [] ages () default {1,2,3};

    String value();
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值