switch和枚举的小坑

工作项目中的 online 和 room 有使用到反射,在一次加需求的时候,发现了某实现类中有众多if else,看着实在难受。于是,手动"优化"成switch,结果发现 online 和 room 启动报错了。一开始怎么也没想到是众多if else改成switch造成的。直到发现输出class文件的目录下多了个RoomHandlerImpl$1.class如图:

class

然后反编译后就会看见$SwitchMap$yourCase'Enumeration,你case的枚举元素就会在这个类中。后来发现只要使用了switch case枚举,就会生成这么一个synthetic
所以,在长连接服务器启动的时候会扫描指定包下的类,然后调用newInstance方法。问题就出在这儿了,因为该类是synthetic,无法被实例化,所以会产生java.lang.InstantiationException,定位到问题,结束!

可能很多人没有见过synthetic类,特地补上,如下:

synthetic

posted @ 2019-06-11 13:21  平湖  阅读(2585)  评论(0编辑  收藏  举报