我在我的Proguard配置中使用此块来防止使用@AccessedViaReflection注释的方法被混淆,并且在简单的情况下它可以正常工作:
-keepclassmembers class * {
@com.mimvista.AccessedViaReflection <fields>;
@com.mimvista.AccessedViaReflection <methods>;
@com.mimvista.AccessedViaReflection <init>(...);
}
但是,当类重写使用@AccessedViaReflection注释的方法并缩小返回类型时,重写的方法会被混淆。 (仅在缩小返回类型时才会出现此问题。)例如:
public class A {
@AccessedViaReflection
public Object get() {return null;}
}
public class B extends A {
@Override
public String get() {return "";}
}
在这种情况下,B的'get()'方法最终会被Proguard混淆。 (实际上,生成的类文件以2个方法结束。一个调用get()返回Object,另一个调用a()返回String。)这是不可取的,会破坏我们的一些反射代码。有没有办法让注释适用于缩小的覆盖?
答案 0 :(得分:0)
您还必须注释该方法。 javac编译器添加了额外的合成方法,以正确覆盖基本方法。就ProGuard或JVM而言,您的方法只是一种方法,因此它是混淆的。