Enum在smali中的形式

2017-12-18  本文已影响26人  SMSM

Class字节码是CompileJavac的产物
Smali文件 是dex反编译后的产物

定义一个枚举类,内部存在多个枚举值。从smali中看,每个枚举值都是一个静态Enum对象,对象的实例化在Class初始化是完成的,Enum对象的属性name是枚举值的名字,比如:『MONDAY』。初始化时存在两份引用,一份在父类Enum的sharedConstantsCache中、一份在自己的WeekEnum中$VALUES数组,调用 WeekEnum.values()走的是自己的数组,调用valueOf走的是父类的遍历查询(Key为class,反射调用静态方法values(),然后再遍历匹配name)。valueOf比较耗时。因为涉及单次反射。

屏幕快照 2017-12-18 下午6.10.22.png
protected Enum(String name, int ordinal) {    this.name = name;    this.ordinal = ordinal;}



.class public final enum Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;
.super Ljava/lang/Enum;
.source "WeekEnum.java"
# annotations
.annotation system Ldalvik/annotation/Signature;
    value = {
        "Ljava/lang/Enum",
        "<",
        "Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;",
        ">;"
    }
.end annotation


# static fields
.field private static final synthetic $VALUES:[Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

.field public static final enum FRIDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

.field public static final enum MONDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

.field public static final enum SATURDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

.field public static final enum SUNDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

.field public static final enum THURSDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

.field public static final enum TUESDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

.field public static final enum WEDNESDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;


# instance fields
.field private id:S

.field private name:I


# direct methods
.method static constructor <clinit>()V
    .locals 10

    .prologue
    const/4 v9, 0x5

    const/4 v8, 0x4

    const/4 v7, 0x3

    const/4 v6, 0x2

    const/4 v5, 0x1

    .line 10
    new-instance v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    const-string v1, "MONDAY"

    const/4 v2, 0x0

    const v3, 0x7f07044c

    invoke-direct {v0, v1, v2, v5, v3}, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;-><init>(Ljava/lang/String;ISI)V

    sput-object v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->MONDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    .line 11
    new-instance v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    const-string v1, "TUESDAY"

    const v2, 0x7f070450

    invoke-direct {v0, v1, v5, v6, v2}, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;-><init>(Ljava/lang/String;ISI)V

    sput-object v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->TUESDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    .line 12
    new-instance v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    const-string v1, "WEDNESDAY"

    const v2, 0x7f070451

    invoke-direct {v0, v1, v6, v7, v2}, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;-><init>(Ljava/lang/String;ISI)V

    sput-object v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->WEDNESDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    .line 13
    new-instance v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    const-string v1, "THURSDAY"

    const v2, 0x7f07044f

    invoke-direct {v0, v1, v7, v8, v2}, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;-><init>(Ljava/lang/String;ISI)V

    sput-object v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->THURSDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    .line 14
    new-instance v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    const-string v1, "FRIDAY"

    const v2, 0x7f07044b

    invoke-direct {v0, v1, v8, v9, v2}, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;-><init>(Ljava/lang/String;ISI)V

    sput-object v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->FRIDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    .line 15
    new-instance v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    const-string v1, "SATURDAY"

    const/4 v2, 0x6

    const v3, 0x7f07044d

    invoke-direct {v0, v1, v9, v2, v3}, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;-><init>(Ljava/lang/String;ISI)V

    sput-object v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->SATURDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    .line 16
    new-instance v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    const-string v1, "SUNDAY"

    const/4 v2, 0x6

    const/4 v3, 0x7

    const v4, 0x7f07044e

    invoke-direct {v0, v1, v2, v3, v4}, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;-><init>(Ljava/lang/String;ISI)V

    sput-object v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->SUNDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    .line 9
    const/4 v0, 0x7

    new-array v0, v0, [Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    const/4 v1, 0x0

    sget-object v2, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->MONDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    aput-object v2, v0, v1

    sget-object v1, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->TUESDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    aput-object v1, v0, v5

    sget-object v1, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->WEDNESDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    aput-object v1, v0, v6

    sget-object v1, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->THURSDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    aput-object v1, v0, v7

    sget-object v1, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->FRIDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    aput-object v1, v0, v8

    sget-object v1, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->SATURDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    aput-object v1, v0, v9

    const/4 v1, 0x6

    sget-object v2, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->SUNDAY:Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    aput-object v2, v0, v1

    sput-object v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->$VALUES:[Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    return-void
.end method

.method private constructor <init>(Ljava/lang/String;ISI)V
    .locals 0
    .param p3, "id"    # S
    .param p4, "name"    # I
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "(SI)V"
        }
    .end annotation

    .prologue
    .line 21
    invoke-direct {p0, p1, p2}, Ljava/lang/Enum;-><init>(Ljava/lang/String;I)V

    .line 22
    iput-short p3, p0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->id:S

    .line 23
    iput p4, p0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->name:I

    .line 24
    return-void
.end method

.method public static getWeekById(I)Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;
    .locals 5
    .param p0, "id"    # I

    .prologue
    .line 43
    invoke-static {}, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->values()[Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    move-result-object v2

    array-length v3, v2

    const/4 v1, 0x0

    :goto_0
    if-ge v1, v3, :cond_1

    aget-object v0, v2, v1

    .line 44
    .local v0, "week":Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;
    invoke-virtual {v0}, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->getId()S

    move-result v4

    if-ne v4, p0, :cond_0

    .line 48
    .end local v0    # "week":Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;
    :goto_1
    return-object v0

    .line 43
    .restart local v0    # "week":Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;
    :cond_0
    add-int/lit8 v1, v1, 0x1

    goto :goto_0

    .line 48
    .end local v0    # "week":Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;
    :cond_1
    const/4 v0, 0x0

    goto :goto_1
.end method

.method public static valueOf(Ljava/lang/String;)Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;
    .locals 1
    .param p0, "name"    # Ljava/lang/String;

    .prologue
    .line 9
    const-class v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    invoke-static {v0, p0}, Ljava/lang/Enum;->valueOf(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;

    move-result-object v0

    check-cast v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    return-object v0
.end method

.method public static values()[Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;
    .locals 1

    .prologue
    .line 9
    sget-object v0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->$VALUES:[Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    invoke-virtual {v0}, [Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->clone()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, [Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;

    return-object v0
.end method


# virtual methods
.method public getId()S
    .locals 1

    .prologue
    .line 27
    iget-short v0, p0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->id:S

    return v0
.end method

.method public getName()I
    .locals 1

    .prologue
    .line 35
    iget v0, p0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->name:I

    return v0
.end method

.method public setId(S)V
    .locals 0
    .param p1, "id"    # S

    .prologue
    .line 31
    iput-short p1, p0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->id:S

    .line 32
    return-void
.end method

.method public setName(I)V
    .locals 0
    .param p1, "name"    # I

    .prologue
    .line 39
    iput p1, p0, Lcom/meituan/sankuai/erpboss/modules/main/dishmanager/bean/dish/WeekEnum;->name:I

    .line 40
    return-void
.end method




public enum WeekEnum {
    MONDAY((short) 1, R.string.week_monday),
    TUESDAY((short) 2, R.string.week_tuesday),
    WEDNESDAY((short) 3, R.string.week_wednesday),
    THURSDAY((short) 4, R.string.week_thursday),
    FRIDAY((short) 5, R.string.week_friday),
    SATURDAY((short) 6, R.string.week_saturday),
    SUNDAY((short) 7, R.string.week_sunday);

    private short id;
    private int name;

    WeekEnum(short id, int name) {
        this.id = id;
        this.name = name;
    }

    public short getId() {
        return id;
    }

    public void setId(short id) {
        this.id = id;
    }

    public int getName() {
        return name;
    }

    public void setName(int name) {
        this.name = name;
    }

    public static WeekEnum getWeekById(int id) {
        for (WeekEnum week : WeekEnum.values()) {
            if (week.getId() == id) {
                return week;
            }
        }
        return null;
    }
}

上一篇 下一篇

猜你喜欢

热点阅读