给产品打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;
}
}
先编译A和B,java –cp B 运行正常,然后修改A为:
public class A {
public Map<String, String> number = new HashMap<String, String>();
}
重新编译A,不编译B,java –cp B 运行出现java.lang.NoSuchFieldError
2. 基类的方法类型改变(包括返回值,参数类型),子类需要重新编译,打patch的时候,需要把子类同时打入。否则子类访问该变量时,会出现NoSuchMethodError.(参数名改变没有关系,你懂的)
3. 基类的静态成员变量改变,如public static final String name,基类值改变,子类需要重新编译,打patch的时候,需要把子类同时打入。子类的该值的内容不变。目前没发现错误。(注意是常量类型)
本文转自 anranran 51CTO博客,原文链接:http://blog.51cto.com/guojuanjun/670300