枚举、反射

news2024/11/24 3:05:40

枚举

jdk1.5之前,需要自己实现枚举

自己实现枚举

public class StatusEnum {

    private final String id;
    private final String code;
    private final String name;

    private StatusEnum(String id, String code, String name){
        this.id = id;
        this.code = code;
        this.name = name;
    }

    public static final StatusEnum TODO = new StatusEnum("1","todo","待完成");
    public static final StatusEnum DONE = new StatusEnum("2","todo","已完成");
    public static final StatusEnum DOING = new StatusEnum("3","doing","正在完成");

    public String getId() {
        return id;
    }

    public String getCode() {
        return code;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "StatusEnum{" +
                "id='" + id + '\'' +
                ", code='" + code + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

jdk1.5之后,提供了枚举

jdk提供的枚举

public enum StatusEnum2 {

    TODO("1","todo","待完成"),

    DONE("2","todo","已完成"),

    DOING("3","doing","正在完成");

    private final String id;
    private final String code;
    private final String name;


    StatusEnum2(String id, String code, String name) {
        this.id = id;
        this.code = code;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public String getCode() {
        return code;
    }

    public String getName() {
        return name;
    }
}

枚举的父类是java.lang.Enum

没有属性的枚举

public enum StatusEnum3 {

    TODO,

    DONE,

    DOING;

}

枚举类常用的方法

toString(): 返回对象名

values:静态方法,获取所有对象名

valueOf(name): 根据name或者对象

        StatusEnum3 doing = StatusEnum3.DOING;
        System.out.println(doing.toString());

        StatusEnum3[] values = StatusEnum3.values();
        for(StatusEnum3 statusEnum3: values){
            System.out.println(statusEnum3.toString());
        }

        StatusEnum3 done = StatusEnum3.valueOf("DONE");
        System.out.println(done.toString());

 

枚举类也可以实现接口

接口

public interface TestInterface {
    
    void show();
}

枚举类

public enum StatusEnum3 implements TestInterface{

    TODO,

    DONE,

    DOING;


    @Override
    public void show() {
        System.out.println("xxx");
    }
}

此时,枚举对象调用接口方法时,调用的是同一个方法。

如果想要每种类型的枚举调用不同的方法实现,可以这样做:

public enum StatusEnum3 implements TestInterface{

    TODO{
        @Override
        public void show() {
            // todo something
        }
    },

    DONE{
        @Override
        public void show() {
            // todo something
        }
    },

    DOING{
        @Override
        public void show() {
            // todo something
        }
    };
    
}

枚举搭配switch case使用

case中不用写StatusEnum3.TODO,直接写TODO就可以了

        StatusEnum3 statusEnum3 = StatusEnum3.DOING;
        switch (statusEnum3){
            case TODO: // do something 
                break;
            case DOING: // do something 
                break;
            case DONE: // do something 
                break;
        }

反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象。

获取字节码信息的四种方式

1. 通过对象获取

2. 通过内置class获取

3.通过forName获取

4.通过类加载器获取

public class Test {

    public static void main(String[] args) throws ClassNotFoundException {
        // 通过对象获取
        Person person = new Person();
        Class<? extends Person> personClass = person.getClass();
        // 通过内置class获取
        Class<Person> personClass2 = Person.class;
        // 通过Class.forName获取
        Class<?> personClass3 = Class.forName("com.xy.shirotest.reflectTest.Person");
        // 通过类加载器获取
        Class<?> personClass4= Test.class.getClassLoader()
                .loadClass("com.xy.shirotest.reflectTest.Person");
    }
}

获取的所有字节码都是同一个。一个类只有一个字节码信息

Class类的具体实例

1. 类

2. 接口

3. 数组

4. 基本数据类型

5. 注解

6. void

        // 可以作为Class类的实例
        // 类
        Class<Object> objectClass = Object.class;
        // 接口
        Class<Serializable> serializableClass = Serializable.class;
        // 数组
        int[] a = {1,2,3};
        // 同一维度,同一个类型的字节码文件一样
        Class<? extends int[]> aClass = a.getClass();
        // 基本数据类型
        Class<Integer> integerClass = int.class;
        // 注解
        Class<Controller> controllerClass = Controller.class;
        // void
        Class<Void> voidClass = void.class;

获取构造器

        // 根据字节码获取构造器
        // 获取字节码
        Class<Object> clazz = Object.class;
        
        // 获取public类型的所有构造器
        Constructor<?>[] publicConstructors = clazz.getConstructors();
        // 获取public类型无参构造器
        Constructor<Object> publicWucanConstructor = clazz.getConstructor();
        // 获取public类型指定构造器(参数根据构造器的参数类型来设定)
        Constructor<Object> publicConstructor = clazz.getConstructor(int.class, double.class);
        
        // 获取所有访问修饰符的构造器
        Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();
        // 获取所有访问修饰符的无参构造器
        Constructor<Object> wucanDeclaredConstructor = clazz.getDeclaredConstructor();
        // 获取所有访问修饰符的指定构造器(参数根据构造器的参数类型来设定)
        Constructor<Object> declaredConstructor = clazz.getDeclaredConstructor(int.class, double.class);

        // 通过构造器创建对象
        Object o1 = publicWucanConstructor.newInstance();
        // 
        Object o2 = declaredConstructor.newInstance(1, 1.2);

获取属性、给属性设值

        // 获取当前类和父类中,所有被public修饰的属性
        Field[] fields = clazz.getFields();

        // 获取当前类中所有属性
        Field[] declaredFields = clazz.getDeclaredFields();

        // 根据属性名获取属性public
        Field gender = clazz.getField("gender");


        // 获取属性具体信息 ---------------------
        // 获取属性名
        String name = gender.getName();
        // 获取属性类型
        String typeName = gender.getType().getName();
        // 获取访问修饰符
        String modifier = Modifier.toString(gender.getModifiers());
        
        // 给属性设值
        Object obj = clazz.newInstance();
        gender.set(obj, "男");

获取方法

        /* 获取方法 */ 
        // 获取运行时类和所有父类的public方法
        Method[] publicMethods = clazz.getMethods();
        // 根据方法名获取不带参数的public方法(运行时类和所有父类的)
        Method eat = clazz.getMethod("eat");
        // 根据方法名和参数类型获取public方法(运行时类和所有父类的)
        Method sleep = clazz.getMethod("sleep", int.class, long.class);

        // 获取运行时类所有方法
        Method[] declaredMethods = clazz.getDeclaredMethods();
        // 根据方法名获取不带参数的方法
        Method hello = clazz.getMethod("hello");
        // 根据方法名和参数类型获取方法
        Method world = clazz.getDeclaredMethod("world", String.class, double.class);

        /* 获取方法相关参数 */
        // 方法修饰符
        String methodModifier = Modifier.toString(world.getModifiers());
        // 方法返回值类型
        Class<?> returnType = world.getReturnType();
        // 方法名
        String methodName = world.getName();
        // 方法参数列表类型
        Class<?>[] parameterTypes = world.getParameterTypes();
        // 注解 只能获取RUNTIME类型的注解
        Annotation[] annotations = world.getAnnotations();
        
        /* 方法调用 */
        Object o = clazz.newInstance();
        Object invokeReturn = world.invoke(o, "zhangsan", 19.8);

获取其他信息

        // 获取运行时class的接口
        Class<?>[] interfaces = clazz.getInterfaces();
        // 获取父类
        Class<? super Object> superclass = clazz.getSuperclass();
        // 获取父类接口
        Class<?>[] superInterfaces = superclass.getInterfaces();
        // 获取当前类的包
        Package aPackage = clazz.getPackage();
        // 获取当前类的注解
        Annotation[] classAnnotations = clazz.getAnnotations();

测试

黑盒测试:不需要关注代码

白盒测试:需要关注代码

junit单元测试属于白盒测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/588444.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用预训练的 ImageNet 模型进行图像分类

在这篇文章中,我们将学习如何使用预训练的 ImageNet 模型来执行图像分类。我们已经看到了如何训练一个简单的神经网络来对 CIFAR-10 数据集中的图像进行分类,但这是一个相对简单的任务,因为只有十个类别。另一方面,对大量对象类型进行分类将需要包含数百万个参数的更大网络…

华为OD机试真题B卷 Java 实现【字符统计】,附详细解题思路

一、题目描述 输入一个只包含小写英文字母和数字的字符串&#xff0c;按照不同字符统计个数由多到少输出统计结果&#xff0c;如果统计的个数相同&#xff0c;则按照ASCII码由小到大排序输出。 数据范围&#xff1a;字符串长度满足 1≤len(str)≤1000 。 二、输入描述 一个…

图像算法工程师岗位的基本职责范围(合集)

图像算法工程师岗位的基本职责范围 图像算法工程师岗位的基本职责范围1 职责&#xff1a; 图像内容识别、图像纹理优化方面的算法基础研发; 三维模型内容识别、三维模型优化方面的算法研发; 遥感影像处理、内容理解方面的算法研发; 以上1,2,3方面的内容可选择某一项或者多项; 可…

CodeForces..翻转魔术.[简单].[找规律]

题目描述&#xff1a; 题目解读&#xff1a; 给定由0&#xff0c;1组成的长度为n的字符串&#xff0c;执行翻转操作&#xff0c;即0变1&#xff0c;1变0&#xff1b; 判断执行一次翻转之后是否为回文。 解题思路&#xff1a; 寻找规律&#xff1a;如果翻转前已经是回文&…

这里有一个源码调试方法,短小精悍,简单粗暴,但足够好用。

文章中有这样的一段描述&#xff1a; 然后有个读者来问我&#xff1a; 是怎么把 JDK 源码中的一行代码给注释掉的&#xff1f; 这个问题确实不错&#xff0c;属于一个偶尔用一下能起到奇效的源码调试技巧。所以我决定写个文章来说明一下这个问题。 但是这个技巧确实非常的简单…

VS输出路径和生成事件

在生成时&#xff0c;常常希望输出文件夹整洁&#xff0c;因此需要设置dll或exe输出位置&#xff0c;同时也希望对一些文件做一些特殊操作 VS的 UI 常用缩写 “./”&#xff1a;代表目前所在的目录。 " . ./"代表上一层目录。 “/”&#xff1a;代表根目录。 生成…

【图像分割】SAM:Segment Anything论文学习V1

论文:2304.Segment Anything 代码&#xff1a; https://github.com/facebookresearch/segment-anything 官网与demo&#xff1a;https://segment-anything.com/ 概要&#xff1a;SAM是什么&#xff1f; 是通用的分割模型 可以通过 模糊的点选择、文字输入、标注框对图片进行标…

Scala学习(十一)---集合高阶

文章目录 1.集合常用方法2.衍生集合3.集合的常用函数 1.集合常用方法 class Test_Func {} object Test_Func{def main(args: Array[String]): Unit {val list List(1, 2, 3, 4, 5)//定义一个List集合val set Set(6, 7, 8, 9)//定义一个Set集合//1.获取集合长度&#xff0c;…

Spring Boot如何与其他技术进行集成,如Spring Cloud、Spring Security、Spring Data等?

Spring Boot与其他技术集成 Spring Boot 是一个快速构建 Spring 应用程序的框架&#xff0c;它提供了自动配置和快速开发的特性&#xff0c;使得开发人员可以更加专注于业务逻辑的实现而不是搭建框架。Spring Boot 可以轻松集成其他 Spring 生态系统中的技术&#xff0c;例如 …

pnpm无法加载文件 (解决方法 )

例如&#xff1a;我现在要运行一个TS的项目&#xff0c;我的电脑上没有安装pnpm&#xff0c;导致我的vscode一直报错无法加载 Pnpm安装 npm install -g pnpm pnpm : 无法加载文件 pnpm : 无法加载文件 C:\Users\HP\AppData\Roaming\npm\pnpm.ps1&#xff0c;因为在此系统上禁…

微念“跌倒”,李子柒也吃不饱

文 | 螳螂观察 作者 | 青月 “共有从前&#xff0c;各有未来。” 杨幂官宣与嘉行传媒结束合作关系的微文&#xff0c;同样适用于现在的微念与李子柒。 李子柒与微念之间的这场MCN机构与网红IP之间由于利益分配的矛盾&#xff0c;经过500多天的博弈后&#xff0c;最终以李子柒…

2.6. Java内存管理与垃圾回收

2.6.1. Java内存模型 在Java中&#xff0c;内存被划分为以下几个区域&#xff1a; 堆&#xff08;Heap&#xff09;&#xff1a;存储对象实例和数组&#xff0c;是垃圾回收的主要区域。栈&#xff08;Stack&#xff09;&#xff1a;存储局部变量和方法调用。每个线程有自己的…

Python scapy二层、三层发送接收数据包

环境&#xff1a; Linux环境&#xff1a;安装scapy&#xff0c; 执行scapy 安装scapy yum install python3-pip (安装python3 pip) pip3 install --upgrade pip yum remove python-pip&#xff08;删除pip&#xff09; pip3 install scapy (安装scapy) 简介&#xff1a; …

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(5月29日论文合集)

文章目录 一、检测相关(12篇)1.1 Linear Object Detection in Document Images using Multiple Object Tracking1.2 Hybrid Energy Based Model in the Feature Space for Out-of-Distribution Detection1.3 BEV-IO: Enhancing Birds-Eye-View 3D Detection with Instance Occu…

原来你是这样的5G 一文了解亚马逊云科技的云上5G专网

根据麦肯锡公司发布的《2021年离散制造业上云调查》报告显示&#xff1a;云转型所带来的IT价值仅占其潜在价值的5&#xff05;&#xff0c;但其业务价值高达95&#xff05;。随着云计算技术的快速发展以及云的IT价值在敏捷性、弹性和经济性几个方面的充分呈现加上同5G技术和应用…

8项seo的日常工作

SEO的日常工作涵盖了一系列任务和活动&#xff0c;旨在优化网站以提高在搜索引擎中的排名和可见性。 以下是SEO的日常工作内容&#xff1a; 关键词研究和优化&#xff1a;定期进行关键词研究&#xff0c;寻找与目标受众和业务相关的热门关键词。优化网站内容、标题、元描述和链…

《Cocos Creator游戏实战》签到日历实现思路

在线体验地址 Cocos Creator | SignCalendar Cocos Store 购买地址&#xff08;如果没有显示&#xff0c;那就是还在审核&#xff09;&#xff1a; https://store.cocos.com/app/detail/4975微店购买地址&#xff1a; https://weidian.com/item.html?itemID6354270477 运行效…

【书评】《写作脑科学》杨滢(@屠龙的胭脂井)

《写作脑科学》是一本介绍写作与脑科学关系的书籍&#xff0c;作者是杨滢。 本书通过对脑科学的研究和分析&#xff0c;揭示了写作的本质和技巧&#xff0c;为写作者提供了有益的指导和启示。 本书的主要内容分为八个部分 第1章 为什么写作跟大脑有关第2章 快速写作&#xff…

Photoshop 2023 Beta 内置Ai绘图功能介绍安装教程

距离Adobe软件公司首次将图像编辑及数字绘画软件Photoshop推出到大众面前已经过去35年&#xff0c;最近该公司又再次书写了属于Photoshop的历史新篇章。 最近&#xff0c;Adobe 宣布 Photoshop&#xff08;Beta&#xff09;迎来更新&#xff0c;新增「创意填充&#xff08;Gen…

3.3. 日期与时间类(Date、Calendar、LocalDate等)

在Java中&#xff0c;我们经常需要处理日期和时间。Java提供了一些类来帮助我们完成这些任务&#xff0c;如Date、Calendar、LocalDate、LocalTime、LocalDateTime和ZonedDateTime等。我们将分别介绍这些类&#xff0c;并给出相应的示例。 1. Date类 Date类是Java提供的一个表…