개발정리

Java Reflection _ class 본문

JAVA

Java Reflection _ class

coffee. 2024. 4. 16. 15:12

클래스

  • 모든 타입은 reference 나 primitive입니다.
  • 클래스,enum 그리고 array 인터페이스 들은 모두 reference 타입들 입니다.
  • 레퍼런스 타입의 예는 String, 래퍼클래스(Double,enum...)입니다.
  • primitive타입의 예는 boolean,byte,short,int ... 이 있습니다.
  • 오브젝트의 모든 타입에 대해 , JVM은 예를 들어 설명합니다. java.lang.Class의 불변의 인스턴스 메소드를 제공하는 런타임 프로퍼티를 조사하도록 객체의 멤버와 타입 정보를 포함한
  • Class는 또한 제공합니다 능력을 새로운 클래스와 오브젝트를 만드는
  • 가장 중요하게, 이것은 모든 리플렉션 API의 진입점 입니다.
  • 이번 섹션은 대부분 클래스를 수반한 리플렉션 동작을 사용합니다.

Class 오브젝트 상기하기

  • 모든 리플렉션 동작의 진입점은 java.lang.Class입니다.
  • java.lang.reflect.ReflectPermission의 예외와 함께 java.lang.reflect는 public생성자가 없습니다.
  • 이러한 클래스들을 얻어오기 위해서, 클래스에 적절한 메소드를 호출하는것은 필수적입니다.
  • 여기 몇가지 Class를 얻어오기 위한 방법이 있습니다.

Object.getClass()

  • 만약 오브젝트의 인스턴스가 사용가능 하다면, 가장 손쉬운 방법으로 Class 의 Object.getClass()를 호출하는 방법이 있습니다. 물론 이방법은 Object를 상속받은 레퍼런스 타입만 가능합니다.다음 예제를 보시죠
Class c = "foo".getClass();
  • String 클래스를 리턴합니다.
    Class c = System.console.().getClass();
  • 여기 유일한 콘솔이 있습니다. 가상 머신과 관련된 이것은 System.console()의 static 메소드에 의해 리턴됩니다.getClass()에 의한 리턴값은 java.io.Console에 상응하는 Class 입니다.
    enum E { A, B}
    Class c = A.getClass();
  • A는 enum E의 인스턴스 입니다.
  • 그러므로 getClass는 enum 타입 E에 상응하는 클래스를 리턴 합니다.
byte[] bytes = new byte[1024];
Class c = bytes.getClass();
  • 배열들은 모두 Object이기 때문에 getClass를 호출하는 것이 가능합니다.
  • byte타입의 배열이 반환됩니다.
import java.util.HashSet;
import java.util.Set;

Set<String> s = new HashSet<String>();
Class c = s.getClass();
  • 이 상황에서는 java.util.Setjava.util.HashSet타입의 객체 의 인터페이스 입니다.
  • 리턴값은 java.util.HashSet에 상응하는 클래스 입니다.

The .class Syntax

  • 만약 타입이 사용가능하지만 인스턴스가 없다면 ".class"를 붙이는 것으로 클래스를 획득할 수 있습니다.
  • 이것은 또한 가장 쉬운 방법입니다. primitive타입 의 클래스를 획득하는
boolean b;
Class c = b.getClass(); // 컴파일 시 에러
Class c = boolean.class; // correct
  • boolean.getClass()문은 컴파일 타임에 에러가 발생할 수 있다는 것을 알아두세요 왜냐하면 boolean타입은 primitive타입 이며 역참조 될 수 없습니다.
  • .class 문법은 boolean에 상응하는 Class를 리턴합니다.
Class c = java.io.PrintStream.class;
  • c의 값은 java.io.PrintStream타입에 상응하는 클래스 일 것 입니다.
    class c = int[][][].class;
  • .class 문법은 주어진 타입의 다차원 배열에 상응하는 클래스를 되찾아 올 것입니다.

Class.forName()

  • 만약 클래스의 충분한 자격이 있는 이름이 가능하다면, class.forName()스태틱 메소드를 사용함 으로써 상응하는 class를 얻는 것이 가능합니다.(qualified name 이란 패키지명을 모두 포함한 클래스명)
  • 이것은 primitive타입에는 사용될 수 없습니다.
  • 배열 클래스의 이름을 위한 문법은 class.getName()으로 묘사됩니다.
  • 이 문법은 레퍼런스 타입과 primitive 타입에 적용됩니다.
    Class c = Class.forName("com.duke.MyLocaleServiceProvider");

primitive 타입 wrapper 의 TYPE 필드

  • .class 방식은 primitive타입 에서 클래스를 얻는 간편하고 선호되는 방식입니다.
  • 하지만 클래스를 얻는 다른 방법이 있습니다.
  • 각 primitive타입과 void는 java.lang의 wrapper 클래스 가 있습니다.
  • 각 wrapper 클래스는 Class와 같은 TYPE 필드가 있습니다.
Class c = Double.TYPE;
Class c = Void.TYPE;

-----------------------------------------------------------------------------------------------------------------------

# 참조 

https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html

'JAVA' 카테고리의 다른 글

Java Reflextion API 개요  (0) 2024.04.15
자바 컴파일 과정  (0) 2024.03.17