You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Proguard技术疑问:如何保留参数含自定义注解的构造方法?

嘿,这个需求我刚好在项目里处理过,用ProGuard的规则就能精准实现,下面给你一步步拆解:

1. 先确保自定义注解不被混淆

首先得让ProGuard“认识”你的自定义注解,不然它连注解都找不到,更别说匹配带注解的构造方法了。所以先加这条规则,把注解本身完整保留:

-keep @interface com.yourpackage.YourCustomAnnotation {
    *;
}

记得把com.yourpackage.YourCustomAnnotation替换成你实际的注解全类名。

2. 核心规则:保留参数含自定义注解的构造方法

接下来就是关键的匹配规则了,用-keepclassmembers来定位目标构造方法,语法如下:

-keepclassmembers class * {
    <init>(** @com.yourpackage.YourCustomAnnotation *);
}

我给你解释下这里的每个部分:

  • <init>是ProGuard里专门指代构造方法的关键字
  • **表示任意数量的前置参数(可以是0个或多个)
  • @com.yourpackage.YourCustomAnnotation *表示某个参数被你的自定义注解标记

如果你的需求是只针对特定类,而不是所有类,把class *换成具体的类全类名就行,比如class com.yourpackage.TargetClass。

举个实际例子

假设你的自定义注解是@MyInject,目标类是com.example.User,它有个构造方法public User(@MyInject String username, int age),那完整的规则就是:

# 保留自定义注解
-keep @interface com.example.MyInject {
    *;
}

# 保留User类中参数带@MyInject的构造方法
-keepclassmembers class com.example.User {
    <init>(** @com.example.MyInject *);
}
重要注意事项

别忘了你的自定义注解的RetentionPolicy至少要设为CLASS,因为ProGuard是在字节码层面处理的,如果注解是SOURCE级别,编译时就会被丢弃,ProGuard根本看不到它。注解的定义应该像这样:

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.CLASS)
public @interface MyInject {
    // 注解的属性(如果有的话)
}

如果需要运行时也能获取到这个注解,就用RetentionPolicy.RUNTIME,但CLASS是满足这个需求的最低要求。

内容的提问来源于stack exchange,提问作者user4003256

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:25:42