-
제목을 보고 내가 무엇에 대해 쓸 것인지 이미 알고 계시다면, 당신의 실력이 여전히 나보다 나은 것 같습니다.
먼저 싱글톤 패턴을 작성해 보겠습니다.
일반 사본을 클립보드 인쇄로 보시겠습니까?
패키지 테스트.반사;
공개 클래스 싱글턴 {
개인 정적 싱글턴 s= null;
개인 싱글턴() {
}
공개 정적 싱글턴 getInstance() {
if (s == null) {
동기화됨(Singleton.class) {
if (s == null) {
s = 새로운 싱글톤();
}
}
}
반환 s;
}
}
패키지 테스트.반사;
공개 클래스 싱글턴 {
개인 정적 싱글턴 s= null;
개인 싱글턴() {
}
공개 정적 싱글턴 getInstance() {
if (s == null) {
동기화됨(Singleton.class) {
if (s == null) {
s = 새로운 싱글톤();
}
}
}
반환 s;
}
}
이 Singleton 클래스는 단일 인스턴스 모델이며 해당 구성 메서드는 new를 통해 인스턴스를 생성할 수 없으며 정적 메서드 getIntance를 호출해야만 인스턴스를 얻을 수 있으며 결코 한 번에 인스턴스를 반환할 수 없습니다. 중복 인스턴스를 만듭니다.
우리의 고객은 다음과 같습니다.
일반 사본을 클립보드 인쇄로 보시겠습니까?
싱글톤 싱글톤 = Singleton.getInstance();
System.out.println(싱글톤);
//singleton = new Singleton();이것은 작동하지 않습니다.
싱글톤 싱글톤 = Singleton.getInstance();
System.out.println(싱글톤);
//singleton = new Singleton();이것은 작동하지 않습니다.
인쇄 결과는 다음과 같습니다.
일반 사본을 클립보드 인쇄로 보시겠습니까?
test.reflect.Singleton@c17164
test.reflect.Singleton@c17164
하지만 개인 생성자를 통해 인스턴스를 어떻게 생성합니까? 대답은 리플렉션입니다.
Reflective Java는 중요한 모듈입니다. 리플렉션을 이해하면 많은 작업을 수행할 수 있습니다. 리플렉션의 기본 원리는 클래스의 바이트코드를 클래스에 대한 다양한 정보를 설명할 수 있는 Class 객체에 매핑하는 것입니다.
아래에서는 클라이언트 측에 일부 코드를 추가합니다.
일반 사본을 클립보드 인쇄로 보시겠습니까?
싱글톤 싱글톤 = Singleton.getInstance();
System.out.println(싱글톤);
//singleton = new Singleton();이것은 작동하지 않습니다.
클래스<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");//이것도 작동합니다
Constructor<?>[] constructors = clazz.getDeclaredConstructors();//선언된 생성자를 가져옵니다.
Constructor<?> privateConstructor = constructors[0];//싱글톤 클래스에는 생성자가 하나만 있습니다.
privateConstructor.setAccessible(true);//액세스 가능 여부를 true로 설정하여 작동시킵니다.
싱글톤 인스턴스 = (싱글톤) privateConstructor.newInstance();
System.out.println(인스턴스);
System.out.println(싱글톤 == 인스턴스);
싱글톤 싱글톤 = Singleton.getInstance();
System.out.println(싱글톤);
//singleton = new Singleton();이것은 작동하지 않습니다.
클래스<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");//이것도 작동합니다
Constructor<?>[] constructors = clazz.getDeclaredConstructors();//선언된 생성자를 가져옵니다.
Constructor<?> privateConstructor = constructors[0];//싱글톤 클래스에는 생성자가 하나만 있습니다.
privateConstructor.setAccessible(true);//액세스 가능 여부를 true로 설정하여 작동시킵니다.
싱글톤 인스턴스 = (싱글톤) privateConstructor.newInstance();
System.out.println(인스턴스);
System.out.println(싱글톤 == 인스턴스);
인쇄된 결과는 다음과 같습니다.
일반 사본을 클립보드 인쇄로 보시겠습니까?
test.reflect.Singleton@c17164
test.reflect.Singleton@1fb8ee3
거짓
test.reflect.Singleton@c17164
test.reflect.Singleton@1fb8ee3
거짓
두 번 생성된 객체가 다르다는 것을 알 수 있습니다. 우리는 private 생성자 메서드를 통해 Singleton 클래스의 인스턴스를 생성했습니다.
이 기사는 CSDN 블로그에서 가져온 것입니다. 재인쇄할 때 출처를 표시하십시오: http://blog.csdn.net/liuhe688/archive/2009/12/31/5110637.aspx
-