【问题标题】:How to keep class which implement an interface with annotation如何保留实现带有注释的接口的类
【发布时间】:2017-08-23 07:47:30
【问题描述】:

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

我有一个类似的界面

@KeepAll
public interface MainEntity {
    //some methods
}

我想让所有实现这个接口的类不被混淆。这在 ProGuard 上可行吗?

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

-keep public class * implements **.MainEntity 

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

【问题讨论】:

    标签: java proguard


    【解决方案1】:

    经过漫长的试错过程,我得到了我想要的。这是解决方案

    使用注释 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>;}
    

    【讨论】:

      【解决方案2】:

      你可以用这样的注解告诉 ProGuard 保留所有内容:

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

      以上内容可以防止界面本身被混淆。

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

      -keep public class * implements **.MainEntity 
      

      所以现在我很困惑你想要实现什么。如果您只对界面进行注释,则对 ProGuard 没有帮助。这些类需要这个注解。

      【讨论】:

      • @xxlali 然后更具体。只有两种选择。在关键字implements 或注释上使用keep。然而,类必须被注释而不是接口
      • 我想说两件事:第一:“不要用 KeepAll 注释混淆接口和类”。我知道该怎么做。你也给出了这个例子。第二件事是:“不要混淆扩展或实现具有 KeepAll 注释的类或接口的类和接口”。我希望我可以更具体
      猜你喜欢
      • 1970-01-01
      • 2012-06-12
      • 2010-10-19
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      相关资源
      最近更新 更多