单例能被反射吗?肯定能。
package com.zkk;
public class ElvisModified {
private static boolean flag = false;
public static boolean getFl(){
return flag;
}
private ElvisModified() {
synchronized (ElvisModified.class) {
if (flag == false) {
flag = !flag;
} else {
throw new RuntimeException("单例模式被侵犯!");
}
}
}
private static class SingletonHolder {
private static final ElvisModified INSTANCE = new ElvisModified();
}
public static ElvisModified getInstance() {
return SingletonHolder.INSTANCE;
}
public void doSomethingElse() {
}
}
package com.zkk;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class Test3 {
/**
* @param args
*/
public static void main(String[] args) {
try {
Class<ElvisModified> classType = ElvisModified.class;
Constructor<ElvisModified> c = classType.getDeclaredConstructor(null);
c.setAccessible(true);
Field[] fields= ElvisModified.class.getDeclaredFields();
for(Field field:fields){
if(Modifier.isStatic(field.getModifiers())){
System.out.println("字段是:"+field.getName());
field.setAccessible(true);
field.set(null,false);
}
}
// System.out.println("当前static:"+ElvisModified.getFl());
ElvisModified e1 = (ElvisModified) c.newInstance();
Field[] fields2= ElvisModified.class.getDeclaredFields();
for(Field field:fields2){
if(Modifier.isStatic(field.getModifiers())){
System.out.println("字段是:"+field.getName());
field.setAccessible(true);
field.set(null,false);
}
}
ElvisModified e2 = ElvisModified.getInstance();
System.out.println(e1 == e2);
} catch (Exception e) {
e.printStackTrace();
}
}
}