JavaStudy

Effective-Java 객체의 생성과 호출 (1~7)

나왔던 질문

Reflection Attack, 리플랙션으로 객체 생성

  • 생성자를 private 로 선언해서 외부 생성을 막으려고 해도 reflection 을 사용하면 외부에서 생성 가능하도록 할수 있다.
import java.lang.reflect.*;

class Test{
    // private 이므로 외부 생성 불가
    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); // 생성자를 public 으로 변경

    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 를 통해 함수를 생성하는게 아니라서 생성자가 호출되지 않는다.을 사용해 변경후 생성 가능