Java 枚举、注解

Java 枚举、注解,第1张

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();
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/795206.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存