java内部类编译之$1.class文件

刚刚因为公司服务器发生变化,原来的邮件服务器需要变更,对应的发邮件方法有点改动——新增了3个类。

本地测试了几次,发邮件成功。因此就把几个对应的class文件传了3个上去。当时到了classes目录下,还发现与一个类名一模一样的"类$1.class"文件,还纳闷呢,虽然可疑,却也只当它是临时文件,没当回事,没传到服务器,重启系统。

结果,客服找我,说后台不能加款,不能补发邮件等问题出现。而我一看日志,没有任何错误。因为是线上环境,又确认只是刚刚才出现,而刚刚以前这些功能都能用。因此我回退了邮件功能,这些问题解除。那么,到底是哪儿的问题呢?我本地测试是可以的。jar包也是一样的,jre版本也是没问题的。我单独答了一套测试环境,debug调试,终于发现在邮件功能的一个类的地方走不下去了,而这个地方是new 一个新的类。经验告诉我,是引用的这个类有问题。仔细检查这个类的导入包,没有其他特殊的,我本地可以那为什么线上会编译有问题?终于在这时候想起那个不起眼的$1.class文件。我删除了他和几个新增的邮件类的class,重新编译。发现它又出现了。这说明它根本不是一个临时文件,是编译生成的有用代码。那到底是什么呢?再检查那个类,发现里面有一个不起眼的匿名类调用,难道是它?我把这个$1.class文件反编译出来,看到里面果然就是那个匿名的内部类。

问题找到,这次连带$1.class在内传入4个class到线上,悄悄重启系统,风平浪静,没人反馈,说明平稳升级了。

posted on 2013-03-19 14:45  Mr.xiong  阅读(3839)  评论(1)    收藏  举报