你听说过增量上线吗?我新入公司第一次听说增量上线,所谓增量上线就是把你更改的java文件在本地编译成为.class文件,然后直接将.class文件扔到服务器上面去。这就是问题所在了,我在一个java类里面引用了一个内部类,然后增量上线的时候我只是把这个java类编译的.class文件扔到了服务器上,然后就gg了。报错缺少$..类文件。找了半天才意识到时内部类也生成了一个.class文件,但是我并没有把内部类的.class文件扔上去。所以我回到idea里面去target里面找到主java文件编译生成的.class文件的文件夹路径,发现里面并没有内部类的编译文件。后来以文件管理器打开该路径居然有内部类的.class文件!!!神奇有木有!!!然后将内部类的.class文件扔到服务器上去,问题解决!!!
附录:
匿名内部类编译时会不会生成class文件,下面来验证
我们知道 在一个类里如果有内部类,则编译是会产生两个class文件,一个类class 一个是内部类class,那么匿名内部类会不会也编译出来一个class呢,我们定义一个接口(接口会单独生成一个class),然后匿名生成这个接口的实例,再编译这个类,看看结果如何:
原始类如下:
public class MyClass {
private MyInterface myInterface = new MyInterface() {
@Override
public void onTaskClick() {
}
};
public interface MyInterface {
void onTaskClick();
}
}
javac 编译后如下:
我们看到生成了一个接口的class文件和 MyClass$1.class文件,这个文件是系统自动为我们起了一个名字 1,也就是说即使我们没有为这个class命名,还是被系统赋予了名字
生成的内部类
classMyClass$1
implements MyClass.MyInterface
{
MyClass$1(MyClass paramMyClass) {}
public void onTaskClick() {}
}
结论:匿名内部类编译后会生成class文件,名称是 1、2...数字
如果我们增加接口个数并相应增加匿名内部类,再次编译,则会相应生成 MyClass$2.classMyClass$3.class...等class文件