switch和枚举的小坑
工作项目中的 online 和 room 有使用到反射,在一次加需求的时候,发现了某实现类中有众多if else
,看着实在难受。于是,手动"优化"成switch
,结果发现 online 和 room 启动报错了。一开始怎么也没想到是众多if else
改成switch
造成的。直到发现输出class
文件的目录下多了个RoomHandlerImpl$1.class
如图:
然后反编译后就会看见$SwitchMap$yourCase'Enumeration
,你case
的枚举元素就会在这个类中。后来发现只要使用了switch case
枚举,就会生成这么一个synthetic
类
所以,在长连接服务器启动的时候会扫描指定包下的类,然后调用newInstance
方法。问题就出在这儿了,因为该类是synthetic
,无法被实例化,所以会产生java.lang.InstantiationException
,定位到问题,结束!
可能很多人没有见过synthetic
类,特地补上,如下: