어떤 경우에는 class
키워드가 어떻게 작동하는지 이해가되지 않습니다.Java에서 class 키워드로 작업하기
예를 들어 get(ClientResponse.class)
메서드는 ClientResponse.class
입니다. 그것이 그것을 얻을 때 이것을 어떻게 사용합니까? 그리고 단지 그것의 인스턴스를 넘는 것 이상의 장점은 무엇입니까?
어떤 경우에는 class
키워드가 어떻게 작동하는지 이해가되지 않습니다.Java에서 class 키워드로 작업하기
예를 들어 get(ClientResponse.class)
메서드는 ClientResponse.class
입니다. 그것이 그것을 얻을 때 이것을 어떻게 사용합니까? 그리고 단지 그것의 인스턴스를 넘는 것 이상의 장점은 무엇입니까?
SomeClass.class
은 Java 클래스 개체를 반환합니다. 클래스가 일반화되어 있으므로 SomeClass.class의 실제 유형은 Class<SomeType>
이됩니다.
이 객체를 사용하는 많은있다, 당신은 여기에 대한 자바 독을 읽을 수 있습니다 : http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html
ClientResponse.class
이 Class<ClientResponse>
의 인스턴스입니다. 일반적으로 Class
개체는 개체의 유형을 나타냅니다.
Object obj = new ClientResponse()
당신이 호출하여 그 객체의 클래스 (유형)를 검색 할 수 있습니다 : 새 인스턴스를 만들 때
obj.getClass()
그래서, 당신은 왜 Class
개체 주위에 전달할 것인가? 일반적이지는 않지만 한 가지 이유는 특정 클래스의 임의의 개수의 인스턴스를 만드는 메소드를 허용하는 것입니다.
ClientResponse resp = ClientResponse.newInstance();
클래스 객체를 사용할 수있는 방법은 다양합니다. 이것은 리플렉션에 사용됩니다. 다음은 더 많은 것을 이해하는 데 도움이되는 링크입니다.
http://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
는 ClientResponse.class
에서 class
클래스 ClientResponse
의 키워드도 정적 필드 아니다.
키워드는 Java에서 클래스를 정의하는 데 사용됩니다. 예 : ClientResponse.class
의 class
public class MyClass { } /* class used here is one of the keywords in Java */
ClientResponse
Class<T>
의 인스턴스.
ClientResponse
인스턴스가 필요한 해당 인스턴스로 이동하는 또 다른 방법이 있습니다. 예컨대
ClientResponse obj = new ClientResponse();
Class clazz = obj.getClass();
단지의 인스턴스를 전달을 통해 장점은 무엇인가?
위의 예에서 obj
이 null (NPE) 인 경우 어떤 상황이 발생하는지 확인할 수 있습니다. 그런 다음 메서드가 ClientResponse
에 대한 Class
인스턴스에 대한 참조를 가져올 수있는 방법이 없습니다.
또한 cglib 또는 javassist와 같은 것으로 동적 프록시가 진행될 수도 있습니다. 또한 실제 구체적인 클래스 유형보다는 인터페이스 또는 추상 클래스로 작업 할 수도 있습니다. 수업을 직접 참조함으로써, 당신은 당신이 원하는 것에 대해 매우 구체적입니다. 또한 작업 할 인스턴스가없는 컨텍스트에서 작업 할 수도 있습니다. LogManager.getLogger (MyClass.class) – Matt
class
키워드와 다른 Class
클래스는 인스턴스를 설명하는 메타 데이터입니다. new
을 호출하여 만드는 인스턴스의 메서드, 데이터 멤버, 생성자 및 기타 기능에 대해 설명합니다.예를 들어
은 (ClientResponse.class) 방법은 그것을 얻고, 단지 그것의 인스턴스를 전달을 통해 장점은 무엇 경우는이를 사용 않는 방법 ClientResponse.class 소요 얻을?
이 메서드에 ClientResponse
의 인스턴스를 전달할 수 없습니다. 에 대한 메타 데이터가 모두 인 ClientResponse
입니다. 인스턴스를 전달한 경우 해당 메소드가 해당 인스턴스의 상태를 변경할 수도 있습니다. 그러나 모든 인스턴스에 대한 메타 데이터를 전달하면 메서드가 새로운 종류의 인스턴스 (예 : 동적 프록시)를 만들거나 ClientResponse
의 모든 인스턴스에 대한 메타 데이터에 의존하는 다른 작업을 수행 할 수 있습니다. 차이점을 보시겠습니까?
클래스는 개체의 "청사진"입니다. 인스턴스는 객체입니다.
우리가
public class SomeClass {
int a;
SomeClass(int a) {
this.a = a
}
}
이있는 경우 우리는이 클래스
SomeClass c = new SomeClass(10);
c
의 인스턴스를 가질 수있는 것은 클래스의 인스턴스입니다. 값이 10
인 a
의 정수입니다.
개체 SomeClass.class
은 Class
을 나타냅니다. 여기 SomeClass.class
는 SomeClass
가
Class
의 object
인 정수 멤버 변수와
및 많은 기타 metadata
은 클래스 SomeClass
에 관한 것입니다. a
에 대한 값이 없음에 유의하십시오.
당신은 get(c)
은 넣다 인스턴스의 데이터를/manupulate 얻기 위해 호출 c.a
또는 다른 유용한 기능처럼 c
의 instance
뭔가를 할 계획 사용해야합니다.
get이 인수가 어떤 유형의 클래스라는 사실에 근거하여 무언가를 반환 할 때는 get(SomeClass.class)
을 사용해야합니다. 예를 들어,이 클래스가 전달 된 클래스 유형에 따라 implementation class
을 가져 오는 Registry
클래스의 메소드 인 경우
가장 중요한 사실은 - 호출 할 인스턴스가 필요 없다는 것입니다. 방법. 어떤 이유로 클래스를 인스턴스화 할 수없는 상황에서 매우 유용합니다. 추상이거나 전용 생성자 만 있거나 Spring 또는 JSF와 같은 일부 프레임 워크에서만 올바르게 인스턴스화 될 수 있습니다.
당신은 심지어에서 온 않는 경우 알고 어떻게의 생성을 얻을하지 않고 요청 된 형식의 개체를 얻기 위해 get
를 호출 할 수 있습니다. 우리가 어떤 자바 파일을 컴파일 할 때마다
는, 컴파일러는 방출 된 바이트 코드에서 유형 java.lang.Class
의, class
라는 public
, static
, final
필드를 포함합니다. 이 필드는 public
및 static
이므로 클래스 이름과 함께 점으로 구분 된 표기법을 사용하여 액세스 할 수 있습니다 (예 : ClientResponse.class
).
+1 문서 참조 용입니다. 그러나 런타임의 실제 유형은 일반 java/lang/Class이며 Java 제네릭 구현 (유형 지우기)으로 인해 일반 유형 인수가 보존되지 않습니다. –
@ KrzysztofJabłoński 코드에서'class clazz = someClass.getClass()'하면 변수를 매개 변수화하라는 메시지가 나타납니다. 타입이 컴파일시 클래스이지만 런타임시 java.lang.Class라고 말하는 것이 맞습니까? –
smcg
예. Java 5에 도입 된 제네릭 (Generics)은 소위 유형 매개 변수를 도입함으로써 컴파일시 유형 안전성을 향상시킵니다. 어떤 타입 - 위험한 연산을 할 때 컴파일러는 타입 파라미터를 비교하고 경고합니다. 바이트 코드 형식의 매개 변수는 정보가 지워지도록 [bounds] (http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html) (또는없는 경우 Object)로 바뀝니다. [Paper] (http://docs.oracle.com/javase/tutorial/java/generics/erasure.html)에서는 java에서와 같이 (예 : [C# 예제] (http://msdn.microsoft. com/ko-ko/library/512aeb7t.aspx)). –