Proguard混淆JavaFX自定义控件StringProperty时FXML属性不存在报错问题
错误原因
- 规则语法错误:原有
-keepclassmembers配置中,匹配方法时未添加括号标识,例如public final java.lang.String *;实际仅匹配String类型的成员字段,完全没有匹配到getText()这类方法,导致属性存取方法未被保护,名称被混淆后FXMLLoader通过反射无法找到对应text属性的操作入口。 - 匹配逻辑不严谨:原有规则仅按返回值类型匹配,没有明确适配JavaFX属性的命名规范,即便语法修正也容易出现误匹配或漏匹配的情况。
- 构造方法未保留:自定义控件的无参构造方法未明确加入保护规则,FXML反射实例化控件时存在失败风险。
解决方案
将Proguard配置中原有针对Control子类的-keepclassmembers规则替换为以下精准配置即可:
<option>-keepclassmembers class * extends javafx.scene.control.Control { <init>(); *** get*(); void set*(***); javafx.beans.property.Property *Property(); }</option>
规则说明
<init>():保留无参构造方法,供FXML反射实例化自定义控件*** get*():匹配并保留所有getter方法(任意返回值、get开头、无参数)void set*(***):匹配并保留所有setter方法(返回值为void、set开头、单个任意类型参数)javafx.beans.property.Property *Property():匹配并保留所有JavaFX属性方法(返回Property子类、以Property结尾、无参数)
该规则可以覆盖所有类型的JavaFX自定义属性(StringProperty、IntegerProperty、BooleanProperty等),无需针对单个属性类型单独配置。
内容的提问来源于stack exchange,提问作者Jawad El Fou
相关产品推荐
相关产品推荐

