Java基础-单例防反射

1.单例的优势

单例模式(Singleton Pattern)是 Java 中创建型模式中最简单的设计模式,它提供了一种创建对象和访问对象以及减少资源重复创建的极佳的方式。

这种模式涉及到一个单一的类或者单一的内部类,该类负责创建同时确保只有该类的唯一对象被创建。这个类提供了以类名访问该对象的访问方式。

既然单例模式这么多优点那么我们怎么设计单例模式呢。

1.我们需要知道对象的创建有哪几种方式:

new一个对象,反射newinstance(), 反序列化ObjectInputStream()

2.我们需要怎样避免重复创建对象。

1.防止多线程不同线程重复创建对象

2.反射方式创建对象

3.序列化创建对象

3.我们需要创建一个具备满足上述功能的类

1.提供类访问对象的方法

2.类的构造器需要隐藏起来

3.多线程安全控制

4.对于序列化和反射的屏蔽处理

2.单例的类型

1.饿汉模式

2.懒汉模式

3.双重检测模式

4.内部类类加载模式

5.集合模式

6.枚举类型模式

3.单例防反射

1.内部类单例防止反射

public class TestReflection {
    public static volatile TestReflection testReflection = null;

    private TestReflection(){
        if(testReflection != null){
            throw new RuntimeException("反射");
        }
    }

    public static TestReflection getInstance(){
        return testReflection = InnerClass.testReflection;
    }

    private static class InnerClass{
        public static TestReflection testReflection = new TestReflection();
    }
}


使用测试
try {
    Class clazz = Class.forName("com.dawn.appbase.utils.TestReflection");
    Constructor constructor = clazz.getDeclaredConstructor();
    constructor.setAccessible(true);
    TestReflection newInstance = (TestReflection) constructor.newInstance();
    Log.d("TestReflection", "TestReflection  "+newInstance);
 catch (Exception  e) {
    Log.d("TestReflection", "Exception "+e.getMessage());
    e.printStackTrace();
 }



//报错
 2021-03-26 21:08:55.715 4397-4397/com.dawn.appbase D/TestReflection: Exception  null
 2021-03-26 21:08:55.716 4397-4397/com.dawn.appbase W/System.err:     at com.dawn.appbase.utils.TestReflection.<init>(TestReflection.java:8)

2.枚举类型防止反射

package com.dawn.appbase.utils;

public enum TestReflection {
    Instance;

    public TestReflection getInstance(){
        return Instance;
    }

}

//测试
try {
    Class clazz = Class.forName("com.dawn.appbase.utils.TestReflection");
    Constructor constructor = clazz.getDeclaredConstructor();
    constructor.setAccessible(true);
    TestReflection newInstance = (TestReflection) constructor.newInstance();
    Log.d("TestReflection", "TestReflection  "+newInstance);
} catch (Exception  e) {
    Log.d("TestReflection", "Exception "+e.getMessage());
    e.printStackTrace();
}

//报错
2021-03-26 21:49:06.293 15728-15728/com.dawn.appbase D/TestReflection: Exception com.dawn.appbase.utils.TestReflection.<init> []
2021-03-26 21:49:06.295 15728-15728/com.dawn.appbase W/System.err: java.lang.NoSuchMethodException: com.dawn.appbase.utils.TestReflection.<init> []

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MatrixData

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值