当我们想要用反射获取一个单例类的时候,不能像获取正常类那样先获取构造函数,再用构造函数new一个对象,因为这样new出来的对象会和我们正常获取的对象不一样,相当于系统里面有了两个该对象,这样就破坏了我们设计单例类的初衷。
所以,正确的获取姿势应该是像下面这样的:
- 获取类
- 获取getInstance()方法并执行。
这样得到的类与我们正常获取的类就是一样的了。
Class<?> aClass = Class.forName("com.xhx.Singleton");//通过单例类的全限定名获取类
Method getInstance = aClass.getMethod("getInstance");//获取单例类的getInstance方法
invoke = getInstance.invoke(aClass);//执行方法获取到单例对象
System.out.println(invoke==Singleton.getInstance());// 与正常获取的类相比
可以看到控制台输出了true,说明我们获取的类与正常获取的类是同一个类