美文网首页
反编译工具分析枚举的原理

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

作者: scarecrowtb | 来源:发表于2018-07-09 08:53 被阅读0次

反编译工具: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代码块中对其进行初始化,这不就是单例的写法吗?所以也知道枚举对象为什么是单例了

相关文章

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

    反编译工具:http://www.javadecompilers.com/jad 使用方式请见Readme.txt...

  • 枚举单例

    描述 本文先反编译枚举,再使用枚举实现单例 枚举 单例 单例源码 单例反编译 引用 http://www.benf...

  • 反编译工具分析动态代理的原理

    反编译工具:http://www.javadecompilers.com/jad 使用方式请见Readme.txt...

  • Android逆向工程

    一 : 反编译 获取到需要的apk 包,利用反编译工具进行反编译. 反编译工具:Android Killer 首先...

  • 2019-08-23开发中常用工具

    1、jd-guijava反编译工具,分析程序源码 2、BeyondCompare版本对比工具,文件,Jar包升级文...

  • Android APK 反编译与安全

    APK 反编译 一、APK反编译基本原理 1.APK分析 assets文件夹:原始资源文件夹,对应着Android...

  • 逆向工具集和安装和使用

    iOS逆向工程的工具大致可分为四类: 检测工具如:Reveal、tcpdump等 反编译工具(反汇编工具 - 分析...

  • APK分析工具小试

    由于需要分析手头一个APK软件,尝试了一下APK分析工具 APK分析工具(以反编译为主) jadx-gui 图形化...

  • Metasploit批量验证爆破telnet

    目的 使用枚举的方法爆破telnet登录密码. 原理 利用gen2k工具,收集来的信息,自动生成密码,使用枚举的方...

  • Android反编译技术总结

    一、Apk反编译工具及其使用方法 1.原理 学习反编译之前,建议先学习一下Apk打包的过程,明白打包完成后的Apk...

网友评论

      本文标题:反编译工具分析枚举的原理

      本文链接:https://www.haomeiwen.com/subject/rzapuftx.html