JAVA修改基类后,patch需要注意了

本文探讨了在Java中给产品打patch时遇到的NoSuchFieldError问题,详细分析了当基类成员类型、方法类型及静态成员变量发生改变时,子类需要重新编译的原因,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给产品打patch时,出现NoSuchFieldError问题,跟踪发现修改后基类,patch会存在问题:

1.  基类成员类型改变(权限:public / protected),子类需要重新编译,打patch的时候,需要把子类同时打入。否则子类访问该变量时,会出现NoSuchFieldError.

public class A {

        public HashMap<String, String> number = new HashMap<String, String>();

}

   public class B extends A{

    public static void main(String args[]){

        B b = new B();

         b.number = null;

    }

}

先编译ABjava –cp B 运行正常,然后修改A:

public class A {

        public Map<String, String> number = new HashMap<String, String>();

}

重新编译A,不编译Bjava –cp B 运行出现java.lang.NoSuchFieldError

2.  基类的方法类型改变(包括返回值,参数类型),子类需要重新编译,打patch的时候,需要把子类同时打入。否则子类访问该变量时,会出现NoSuchMethodError.(参数名改变没有关系,你懂的)

3.  基类的静态成员变量改变,如public static final String name,基类值改变,子类需要重新编译,打patch的时候,需要把子类同时打入。子类的该值的内容不变。目前没发现错误。(注意是常量类型)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值