忙里偷闲,做了一些反射机制中的测试。。。。
问题一: 即使在非并发的情况下,单例模式能保证单例么?
先来一个最简单的单例模式:
Java代码
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance(){
return instance;
}
}
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance(){
return instance;
}
}
测试类:
Java代码
import java.lang.reflect.Constructor;
public class TestSingleton {
public static void main(String[] args) {
try {
Constructor<?> con = Class.forName(Singleton.class.getName()).getDeclaredConstructor();
con.setAccessible(true);
Singleton single1 = (Singleton)con.newInstance();
Singleton single2 = (Singleton)con.newInstance();
System.out.println("single1.equals(single2):"+single1.equals(single2));
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.lang.reflect.Constructor;
public class TestSingleton {
public static void main(String[] args) {
try {
Constructor<?> con = Class.forName(Singleton.class.getName()).getDeclaredConstructor();
con.setAccessible(true);
Singleton single1 = (Singleton)con.newInstance();
Singleton single2 = (Singleton)con.newInstance();
System.out.println("single1.equals(single2):"+single1.equals(single2));
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果:
Java代码
single1.equals(single2):false
single1.equals(single2):false
结论:在反射的情况下,单例模式失效,这是因为通过反射可以获取私有属性,通过调用相应的setAccessible()方法,可以使private属性失效。那么如何能保证的确只能有一个实例呢?在我认为,如果某一程序故意通过反射来绕过单例的限制,则它要么是恶意程序,要么是一个逻辑错误,可以直接抛runtimeException,来让程序终止,否则一旦生成多个实例,后果是不可控的。个人改进如下:
Java代码
public class Singleton {
private static Singleton instance = new Singleton();
private static boolean flag = true;
private Singleton() {
if(flag){
//other code here.....
flag = !flag;
return;
}else{
throw new RuntimeException("dulpicated instance of "+ Singleton.class.getName());
}
}
public static Singleton getInstance(){
return instance;
}
}
public class Singleton {
private static Singleton instance = new Singleton();
private static boole
JAVA反射机制详解_IT/计算机_专业资料。对反射机制有非常详细的解释第10 章 Java 语言的反射机制 在 Java 运行时环境中,对于任意一个类,能否知道这个类有哪些...
—检测一个在运行期间才知道名字的对象的方法 利用 Java 反射机制我们可以很灵活的对已经加载到 Java 虚拟机当中的类信 息进行检测。 当然这种检测在对运行的性能...
Java反射机制 Java反射机制 本课程主要讲述Java反射机制 本课程要求大家对Java泛型知识有所了解,因为程序代码 中大量使用了泛型相关知识 2010-12-2 成都天府软件园...
Java 反射机制一、 Java 反射机制 1、什么是 java 语言的反射机制 JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方 法;对于任意一...
理解Java反射机制 ? 理解Java的动态代理 ? Spring IoC原理剖析 Java泛型在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object 的引用来实现参数的“任意化...
谈 java 反射机制 Java 反射机制 Java 集合浅析 Java 的类反射机制 Java 反射机制的学习 Java 反射 Reflection--运行时生成实例 Java 反射机制 Java 反射机制 2 ...
JAVA 反射机制定义: JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所 有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态 ...
Java 开发员 STY Manoel Lemos Singularity 系统公司 CEO/CTO 1
java反射机制及例子_工学_高等教育_教育专区。反射原理讲解及例子演示1 Java 反射 reflection Java 提供了一套机制来动态执行方法和构造方法, 以及数组操作等, 这...
java反射机制的用法_计算机软件及应用_IT/计算机_专业资料。java反射机制的用法计算机交流平台:计算机故障_计算机论坛 www.it168bbs.com wy java 反射机制的用法...
热门文档