java

자바 - 실행 시간 타입 정보와 리소스

Apr 06, 2020

실행 시간 타입 정보와 리소스

자바에서는 실행 시간에 깨체가 어느 클래스에 속하는지 알아낼 수 있따. equals와 toString 메서드를 구현할 때 유용하다. 게다가 클래스는 어떻게 로드했는지 알아내어 클래스와 관련된 데이터, 즉 리소스를 로드할 수도 있다.

1 Class 클래스

getClass 메서드는 호출받은 클래스를 나타내는 객체를 돌려준다.

public static void main(String[] args) {
    Object obj = System.out;
    Class<?> cl = obj.getClass();
    System.out.println("This object is an instance of " + cl.getName());
    // This object is an instance of java.io.PrintStream
}

정적 메서드 Class.forName을 사용해서 Class 객체를 얻을 수도 있다.

public static void main(String[] args) throws ReflectiveOperationException {
    String className = "java.util.Scanner";
    Class<?> cl = Class.forName(className);
    System.out.println(cl);
    // class java.util.Scanner
}

원하는 클래스를 미리 알고 있다면 Class.forName 대신 클래스 리터럴을 사용하자.

public static void main(String[] args) {
    Class<?> cl = java.util.Scanner.class;
    System.out.println(cl);
    // class java.util.Scanner
}

다른 탕비에 관한 정보를 얻을 때도 .class 접미어를 사용할 수 있다.

Class<?> cl = String[].class // String[] 배열 타입을 작성한다.
Class<?> cl2 = Runnable.class // Runnable 인터페이스를 작성한다.
Class<?> cl3 = int.class // int 타입을 작성한다.
Class<?> cl4 = void.class // void 타입을 작성한다.

java.lang.Class 클래스의 자바독 링크



2. 리소스 로드하기

Class 클래스의 유용한 서비스 중 하나는 설정 파일이나 이미지처럼 프로그램에 필요한 리소스를 찾아오는 일이다. 클래스 파일과 같은 디렉터리에 리소스를 넣었을 때 해당 파일에 대응하는 입력 스트림을 얻을 수 있다.

InputStream stream = Demo.class.getResourceAsStream("config.txt");
Scanner in = new Scanner(stream);



3. 클래스 로더

클래스 로더는 바이트를 로드해서 가상 머신의 클래스나 인터페이스로 변환하는 역할을 한다.`

4. 컨텍스트 클래스 로더

메서드가 클래스를 동적으로 로드하는데 또 다른 클래스 로더가 로드한 클래스에서 이 메서드를 호출하면 문제가 된다. 이 문제를 해결하는 방법 중 하나가 컨텍스트 클래스 로더를 사용하는 것이다.

5. 서비스 로더

프로그램에서 플러그인을 구현할 때 플러그인 설계자에게 플러그인 기능을 구현하는 방법은 보통 어느 정도 자유롭게 해준다. 또한, 여러 구현체 중에서 선택할 수 있게 해주기도 한다. 이때 ServiceLoader 클래스를 이요하면 공통 인터페이스를 준수하는 플러그인을 손쉽게 로드할 수 있다.