枚举
枚举为什么可以实现单例
如果是枚举类型,则不能通过反射创建枚举对象!
那我们试试,是否是真的:
enum EnumSingle{
INSTANCE;
public EnumSingle getInstance(){
return INSTANCE;
}
}
class Test{
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException
{
EnumSingle instance1 = EnumSingle.INSTANCE;
Constructor<EnumSingle> enumsingle = EnumSingle.class.getDeclaredConstructor(null); //无参构造
enumsingle.setAccessible(true);
// 这儿会出现成功了
EnumSingle instance2 = enumsingle.newInstance(); // 直接调用构造函数建立对象
LazyMan instance3 = enumsingle.newInstance(); // 直接调用构造函数建立对象
}
}
以上代码运行:出现异常,表示不存在默认无参构造函数
还原一下EnumSingle类,发现其中存在无参构造!!!
使用JAD反编译一下试试:最后发现反编译的结果中,不存在默认无参构造。但是存在一个有参构造:
private EnumSingle(String s,int i)
{
super(s,i);
}
OK,修改反射的构造器:
enum EnumSingle{
INSTANCE;
public EnumSingle getInstance(){
return INSTANCE;
}
}
class Test{
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException
{
EnumSingle instance1 = EnumSingle.INSTANCE;
// 使用有参构造
Constructor<EnumSingle> enumsingle = EnumSingle.class.getDeclaredConstructor(String.class, int.class); //无参构造
enumsingle.setAccessible(true);
// 这儿会出现成功了
EnumSingle instance2 = enumsingle.newInstance(); // 直接调用构造函数建立对象
LazyMan instance3 = enumsingle.newInstance(); // 直接调用构造函数建立对象
}
}
出现了正确的结果:Cannot reflectively create enum objects