didi / DroidAssist

A lightweight Android Studio gradle plugin based on Javassist for editing bytecode in Android.
Apache License 2.0
890 stars 150 forks source link

类的static final String,无法替换 #18

Closed tigerose closed 4 years ago

tigerose commented 4 years ago

FieldRead,InitializerExecution,都是过了,都是 类的static String变量可以替换,但是static final String就不行。

wangwang1069 commented 4 years ago

根据JDK class编译过程,static final 的 field 在编译成 class 后,所有使用该 field 的地方都会被替换成字面量,因此无法被替换,例如:

    public static final String NAME = "hulk";
    public String getName() {
        return NAME;
    }

经过编译后,使用 NAME 变量的地方会被替换成 "hulk" 字面量:

    public static final String NAME = "hulk";
    public String getName() {
        return "hulk";
    }

因此,是 java 本身的限制导致的。

tigerose commented 4 years ago

根据JDK class编译过程,static final 的 field 在编译成 class 后,所有使用该 field 的地方都会被替换成字面量,因此无法被替换,例如:

    public static final String NAME = "hulk";
    public String getName() {
        return NAME;
    }

经过编译后,使用 NAME 变量的地方会被替换成 "hulk" 字面量:

    public static final String NAME = "hulk";
    public String getName() {
        return "hulk";
    }

因此,是 java 本身的限制导致的。

是啊,我之前查原因时,看了 .class 文件,确实是如此。 只能把 static final String从变量替换成方法,然后再用droidAssist。。。但是我要改的是BuildConfig。。。所以,代码不是我的,就改不了。。。可惜了。