如何使用注解保留实现接口的类

4

我定义了一个名为@KeepAll的注解。

我有一个类似于以下代码的接口:

@KeepAll
public interface MainEntity {
    //some methods
}

我希望能够防止所有实现此接口的类被混淆。在ProGuard上是否有可能实现?

注意:我知道可以将其定义为

-keep public class * implements **.MainEntity 

但我不想指定接口名称,而是注释名称。

2个回答

4

经过长时间的试错,我终于得到了想要的结果。以下是解决方案:

在注释 KeepAll 中保留类名。

-keep @com.package.name.KeepAll public class **

使用注解KeepAll来保留类和接口的所有成员;

-keepclassmembers @com.package.name.KeepAll class ** { public <methods>; <fields>;}

保留实现了具有KeepAll注解的类的所有类成员。(这是我想要的)

-keepclassmembers public class * implements @com.package.name.KeepAll ** { public <methods>; <fields>;}

-1

您可以使用以下注释告诉ProGuard保留所有内容:

-keep @com.google.inject.Singleton public interface *

以上代码将保留接口本身不被混淆。

要获取接口的实现,您可以执行以下操作:

-keep public class * implements **.MainEntity 

现在我有点困惑你想要实现什么。如果你只是注释接口,这对ProGuard没有帮助。类需要这个注释。


@xxlali 那就更具体一点。只有两个选项。在关键字 implements 上使用 keep,或者在注解上使用 keep。然而,这些类必须被注解,而不是接口。 - Nico
我想说两件事:第一:“不要使用KeepAll注释混淆接口和类”。我知道如何做到这一点。你也给了这方面的例子。第二件事是:“不要混淆继承或实现具有KeepAll注释的类或接口的类或接口”。希望我能更明确。 - xxlali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接