在网上搜了一大堆,都是反射调用单例方法,破坏了类的单例,如何规避。发现都不是我要的结果,首先说下我的需求,服务器的同事提供了一个jar包,里面有个类提供了单例的方法,UDPClient,提供给客户端与服务器进行p2p登录与p2p下载的,要求全局只有一个对象,我试了下,初始化类加载器,loadClass对象,获取其getInstance方法,结果发现在不同的线程里面反射调用登录方法多次后,服务器那边显示有多台客户端与服务器连接了,很明显,一台设备只能对应一个结点,多次登录应该是可以避免的,但是由于我是反射调用提供jar方法,所以,每次登录都创建了一个UDPClient对象,我分析Android类型加载机制,认为导致出现此原因是因为我每次都会取创建一个ClassLoader,每个classLoader取反射加载对象,创建的对象都是不一样的,所以我改成了全局共用一个ClassLoader,然后再反射调用UDPClient.getInstance方法,果然,这回生成的都是同一个对象,bug解决了。
看程序截图,执行p2pLogin方法,会每次反射调用getInstance,创建的对象的hashcode都是同一个值