反射单例

package com.mycon.app;

import java.lang.reflect.Constructor;
import java.util.Arrays;

public class SingletonTest {

    @SuppressWarnings("rawtypes")
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        System.out.println(singleton.getName());
        Singleton s2 = null;
        try {
            Constructor[] constructors = Singleton.class.getDeclaredConstructors();
            System.out.println(constructors.length);
            for (Constructor c : constructors) {
                System.out.println(c.getName());
                Class[] params = c.getParameterTypes();
                System.out.println("Class params:" + Arrays.toString(params));
                if (params.length == 1) {            // 取消语法检查
                    c.setAccessible(Boolean.TRUE);
                    s2 = (Singleton)c.newInstance(new Object[]{"Swift"});
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("s2:" + s2);
        System.out.println("s2-name:" + s2.getName());
        System.out.println("s1-name:" + singleton.getName());
    }
}    
package com.mycon.app;

public class Singleton {

    private String name;

    private Singleton(String name) {
        this.name = name;
    }

    public static Singleton getInstance() {
        return SingletonHolder.SINGLETON_HOLDER;
    }

    private static class SingletonHolder {
        public static final Singleton SINGLETON_HOLDER = new Singleton("Jack");
    }

    public String getName() {
        return name;
    }
}

ouput:

Jack
2
com.mycon.app.Singleton
Class params:[class java.lang.String, class com.mycon.app.Singleton]
com.mycon.app.Singleton
Class params:[class java.lang.String]
s2:[email protected]
s2-name:Swift
s1-name:Jack

时间: 2024-08-03 07:03:14

反射单例的相关文章

(单例设计模式之一)饿汉式的反射与反序列化漏洞

1.闲话少说,直接上代码. import java.io.Serializable;//饿汉式public class Singleton01 implements Serializable{    //1.私有的属性    private static Singleton01 instance=new Singleton01();    //2.私有的构造器    private Singleton01(){}    //3.共有的get()方法    public static  Singl

黑马程序员--Java基础学习笔记【单例设计模式、网络编程、反射】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 设计模式分类: 创建模式:是对类的实例化过程的抽象化,又分为类创建模式和对象创建模式 类创建模式:工厂方法模式 对象-:简单工厂(静态工厂方法)模式.抽象工厂模式.单例模式.建造模式- 结构模式:描述如何将类或者对象结合在一起形成更大的结构 适配器模式.缺省模式.合成模式.装饰模式(包装模式).门面模式- 行为模式:对不同的对象之间划分责任和算法的抽象化 不变模式.策略模式.迭代子模式.命令模

反射破坏单例的私有构造函数保护

Java的反射破坏单例的私有构造函数保护,最典型的就是Spring的Bean注入,我们可以通过改造私有构造函数来防止. 在Singleton中,我们只对外提供工厂方法(获取单例),而私有化构造函数,来防止外面多余的创建. 对于一般的外部调用来说,私有构造函数已经很安全了.        public class Singleton { private Singleton(){} private static volatile Singleton instance = null; public s

Java单例---反射攻击单例和解决方法

静态内部类中引出了反射攻击的问题 import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class Test1 { public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, In

如何防止JAVA反射对单例类的攻击?

加静态标志位,构造方法通过synchronized修饰.或者枚举 举例1:不经过处理的单例类被JAVA反射机制攻击 Singleton.java    代码清单[1.1] 1 public class Singleton 2 { 3 private static boolean flag = true; 4 private static final Singleton INSTANCE = new Singleton(); 5 6 private Singleton() 7 { 8 } 9 10

反射破坏单例

class SingLeton{ private static SingLeton inntleton = null; private ArrayList stlit = null; //私有构造函数 private SingLeton() { } public static SingLeton singl() { if (inntleton == null) { inntleton = new SingLeton(http://www.amjmh.com/v/); } return inntl

设计模式:单例

传统的实现方法:两私一公,涉及线程安全问题(即使有多重检查锁也可以通过反射破坏单例) public class Singleton { private volatile static Singleton instance = null; private Singleton () { } public static Singleton getSingleton() { if(instance == null) { synchronized(Singleton.class) { if(instanc

使用单元素枚举实现单例

如果不涉及到线程安全及延迟加载,单例最简单的写法: public class SingletonTest { public static final SingletonTest instance = new SingletonTest(); private SingletonTest(){ } } 考虑到线程安全跟延迟加载,修改如下: public class SingletonTest { public static final SingletonTest getInstance(){ ret

单例模式序列化后反序列化单例失效的问题

不做处理的情况下,单例模式失效,代码如下: public class User implements Serializable { public String getName() { return name; } public void setName(String name) { this.name = name; } public static final User INSTANCE= new User(); private String name ; // private Object r