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

解决PageFactory.initElements抛出Unable to make protected final java.lang.Class问题

Java19下Appium PageFactory初始化报错的解决办法

问题根源

Java 9及以上的模块系统(JPMS)收紧了反射访问权限,Appium的PageFactory底层依赖的反射操作在Java19里被模块权限拦截,导致无法访问java.lang.Class的protected方法,从而抛出该错误。

解决办法

  • 给JVM加启动参数放宽反射限制
    在TestNG.xml的测试配置中添加JVM参数,放开相关模块的反射访问权限:

    <suite name="YourTestSuite">
      <test name="AppiumAutomationTests">
        <parameter name="jvmArgs" value="--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED"/>
        <!-- 你的测试类、其他配置内容 -->
      </test>
    </suite>
    

    如果是通过IDE直接运行测试,直接在运行配置的VM参数中粘贴上述--add-opens内容即可。

  • 降级Java版本到LTS版
    若项目没有硬性要求使用Java19,直接降级到Java11或8(均为长期支持版本),可彻底绕开模块系统的反射限制,这是最省心的兼容方案。

  • 放弃PageFactory,手动初始化元素
    不再使用PageFactory.initElements(),改为手动编写元素定位代码,完全避开反射逻辑:

    public class WelcomeScreen {
        private AndroidDriver<MobileElement> driver;
        public MobileElement welcomeButton;
    
        public WelcomeScreen(AndroidDriver<MobileElement> driver) {
            this.driver = driver;
            welcomeButton = driver.findElement(By.id("com.your.app:id/welcome_btn"));
        }
    }
    

    这种方式不仅解决权限问题,元素定位逻辑也更直观可控。

  • 升级Appium Java Client依赖版本
    检查当前使用的Appium Java Client版本,升级到最新稳定版(如8.x系列),新版本大概率已适配Java17+的模块系统,修复了该反射权限bug。Maven依赖示例:

    <dependency>
        <groupId>io.appium</groupId>
        <artifactId>java-client</artifactId>
        <version>8.6.0</version> <!-- 替换为当前最新稳定版本 -->
    </dependency>
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:12:09