Синглтон с несколькими загрузчиками классов - PullRequest
0 голосов
/ 07 мая 2020

В одном из интервью меня спросили, как убедиться, что один объект присутствует в классе Singleton при использовании с несколькими загрузчиками классов. Я следил за этим SO Question , но не мог понять, как мы должен вызвать getClass(). Поскольку в ответе нет информации об этом, а также в ссылке , предоставленной в ответе.
Я новичок в загрузчиках классов, и мне не все так ясно. Я пробовал код и пробовал несколько комбинаций, но каждый раз получаю два экземпляра вместо одного.

package com.design_pattern;

import java.io.*;
import java.lang.reflect.Constructor;

public class SIngletonPattern {

    public static void main(String[] args) throws Exception {
        DatabaseConnection databaseConnection = DatabaseConnection.getDatabaseConnection();

        ClassLoader classLoader = SIngletonPattern.class.getClassLoader();
        System.out.println(classLoader);
        //Class classs = classLoader.getClass().forName(DatabaseConnection.class.getName());

        Class classs = DatabaseConnection.getClass(DatabaseConnection.class.getName());

        System.out.println(classs.getName());
        Constructor[] declaredConstructors = classs.getDeclaredConstructors();
        DatabaseConnection db2 = null;
        for (Constructor d:declaredConstructors) {
            d.setAccessible(true);
            db2 = (DatabaseConnection) d.newInstance();
        }

        if(db2 == null){
            System.out.println("null");
        }else{
            System.out.println(databaseConnection == db2);
        }

    }

}

class DatabaseConnection implements Serializable {

    private static volatile DatabaseConnection databaseConnection;

    private DatabaseConnection() {
        System.out.println("Instance created");
    }


    public static DatabaseConnection getDatabaseConnection() {
        System.out.println("getInstance()");
        if (databaseConnection == null) {
            synchronized (DatabaseConnection.class) {
                if (databaseConnection == null) {
                    databaseConnection = new DatabaseConnection();
                }
            }
        }
        return databaseConnection;
    }

    protected Object readResolve() {
        return databaseConnection;
    }

    public static Class getClass(String classname)
            throws ClassNotFoundException {
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        if(classLoader == null)
            classLoader = DatabaseConnection.class.getClassLoader();
        return (classLoader.loadClass(classname));
    }

}
...