反编译工具分析枚举的原理

反编译工具:http://www.javadecompilers.com/jad 使用方式请见Readme.txt,在windows下运行jad -sjava xxx.class就可以轻而易举的将class文件反编译成java文件,从而分析其具体的实现原理了。
一、枚举的原理
我们都知道

Android上不应该使用枚举,占内存,应该使用@XXXDef注解来替代

但枚举的原理是什么?你说它占内存到底占多少内存呢,如何佐证?这里用jad工具简要分析一下。

首先写个枚举类

public enum Food {
    FISH,MEAT,RICE
}

从java代码里看不出什么,大家应该都知道java类编译后会产生class文件。越接近底层,本质就越能暴露出来
javac编译出Food.class文件

javac Food.java

再通过javap命令看一下class文件的内容

javap Food.class
public final class Food extends java.lang.Enum<Food> {
  public static final Food FISH;
  public static final Food MEAT;
  public static final Food RICE;
  public static Food[] values();
  public static Food valueOf(java.lang.String);
  static {};
}

这里大概可以看到枚举的本质,我们自定义的枚举类Food其实就是一个继承于Enum,每个枚举对象都是一个static final的类对象。
利用上面的工具jad对.class进行反编译:

jad -sjava Food.class

就可以生成对应的java文件,输出如下

public final class Food extends Enum
{

    public static Food[] values()
    {
        return (Food[])$VALUES.clone();
    }

    public static Food valueOf(String s)
    {
        return (Food)Enum.valueOf(Food, s);
    }

    private Food(String s, int i)
    {
        super(s, i);
    }

    public static final Food FISH;
    public static final Food MEAT;
    public static final Food RICE;
    private static final Food $VALUES[];

    static 
    {
        FISH = new Food("FISH", 0);
        MEAT = new Food("MEAT", 1);
        RICE = new Food("RICE", 2);
        $VALUES = (new Food[] {
            FISH, MEAT, RICE
        });
    }
}

最终生成了这样的类。里面维护了三个Food型的静态变量,以及一个数组,并且实现了values以及valueof方法,和直接定义三个静态INT常量相比,自然内存占用要多。
另外可以看到,构造方法为private,定义了静态变量,并且在static代码块中对其进行初始化,这不就是单例的写法吗?所以也知道枚举对象为什么是单例了

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,084评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,163评论 18 399
  • 闲来无事,打开大学时写的日记,突然发现里面夹杂着曾经投过校刊的一篇关于《秋意》的文章,以此来怀念那段不曾消逝的青春...
    非缮阅读 1,513评论 0 0
  • 红衣佳人白衣友,朝与同歌暮同酒。 世人谓我恋广外,其实只恋广外某。 ——新一代计算机界的文豪,既浪漫又有技术,it...
    是玉静呀阅读 1,585评论 0 0
  • 原来那些的阅历成就了今天的自己
    d3993c4b32f3阅读 1,121评论 0 0

友情链接更多精彩内容