Effective-Java 객체의 생성과 호출 (1~7)
나왔던 질문
Reflection Attack, 리플랙션으로 객체 생성
- 생성자를 private 로 선언해서 외부 생성을 막으려고 해도 reflection 을 사용하면 외부에서 생성 가능하도록 할수 있다.
import java.lang.reflect.*;
class Test{
private Test()
{
System.out.println("Test");
}
}
class Main{
public static void main(String[] args) throws ClassNotFoundException,
InstantiationException, IllegalAccessException, ReflectiveOperationException{
Class<Test> kclass = Test.class;
Constructor<Test> cons = kclass.getDeclaredConstructor();
cons.setAccessible(true);
Object object = cons.newInstance();
}
}
- 리플랙션을 통해서 객체는 언제든 생성 가능하다
- 기본 생성자가 없더라도 생성 가능
- private 로 선언하더라도 setAccessible
Cloneable 은 언제 사용하나?
- clone() 함수를 가진 자바 인터페이스 이다.
- 결국 자바 기본 Object 의 native 함수인 clone 을 호출해서 깊은 복사를 진행하게 된다. Object 의 clone 함수는 protected 로 외부에서 호출은 불가
@Override
public Stack clone() {
try {
Stack result = (Stack) super .clone();
result.elements = elements.clone();
} catch(CloneNotSupportedException e) {
throw new AssertionError();
}
- JDK 에서 ThreadSafe 한 자료구조를 설계하기 위해서는 Cloneable 인터페이스를 상속해서 정의 해야한다.
- concurrent 관련 자료구조, vector HashTable 같은 자바 1.2 자료구조 등등
- clone 은 new 를 통해 함수를 생성하는게 아니라서 생성자가 호출되지 않는다.을 사용해 변경후 생성 가능