2012-10-19 4 views
10

어떤 경우에는 class 키워드가 어떻게 작동하는지 이해가되지 않습니다.Java에서 class 키워드로 작업하기

예를 들어 get(ClientResponse.class) 메서드는 ClientResponse.class입니다. 그것이 그것을 얻을 때 이것을 어떻게 사용합니까? 그리고 단지 그것의 인스턴스를 넘는 것 이상의 장점은 무엇입니까?

답변

10
SomeClass.class 

은 Java 클래스 개체를 반환합니다. 클래스가 일반화되어 있으므로 SomeClass.class의 실제 유형은 Class<SomeType>이됩니다.

이 객체를 사용하는 많은있다, 당신은 여기에 대한 자바 독을 읽을 수 있습니다 : http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html

+2

+1 문서 참조 용입니다. 그러나 런타임의 실제 유형은 일반 java/lang/Class이며 Java 제네릭 구현 (유형 지우기)으로 인해 일반 유형 인수가 보존되지 않습니다. –

+0

@ KrzysztofJabłoński 코드에서'class clazz = someClass.getClass()'하면 변수를 매개 변수화하라는 메시지가 나타납니다. 타입이 컴파일시 클래스 이지만 런타임시 java.lang.Class라고 말하는 것이 맞습니까? – smcg

+0

예. 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)). –

0
여기

ClientResponse.classClass<ClientResponse>의 인스턴스입니다. 일반적으로 Class 개체는 개체의 유형을 나타냅니다.

Object obj = new ClientResponse() 

당신이 호출하여 그 객체의 클래스 (유형)를 검색 할 수 있습니다 : 새 인스턴스를 만들 때

obj.getClass() 

그래서, 당신은 왜 Class 개체 주위에 전달할 것인가? 일반적이지는 않지만 한 가지 이유는 특정 클래스의 임의의 개수의 인스턴스를 만드는 메소드를 허용하는 것입니다.

ClientResponse resp = ClientResponse.newInstance(); 
6

ClientResponse.class에서 class 클래스 ClientResponse의 키워드도 정적 필드 아니다.

키워드는 Java에서 클래스를 정의하는 데 사용됩니다. 예 : ClientResponse.classclass

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 인스턴스에 대한 참조를 가져올 수있는 방법이 없습니다.

+0

또한 cglib 또는 javassist와 같은 것으로 동적 프록시가 진행될 수도 있습니다. 또한 실제 구체적인 클래스 유형보다는 인터페이스 또는 추상 클래스로 작업 할 수도 있습니다. 수업을 직접 참조함으로써, 당신은 당신이 원하는 것에 대해 매우 구체적입니다. 또한 작업 할 인스턴스가없는 컨텍스트에서 작업 할 수도 있습니다. LogManager.getLogger (MyClass.class) – Matt

1

class 키워드와 다른 Class 클래스는 인스턴스를 설명하는 메타 데이터입니다. new을 호출하여 만드는 인스턴스의 메서드, 데이터 멤버, 생성자 및 기타 기능에 대해 설명합니다.예를 들어

은 (ClientResponse.class) 방법은 그것을 얻고, 단지 그것의 인스턴스를 전달을 통해 장점은 무엇 경우는이를 사용 않는 방법 ClientResponse.class 소요 얻을?

이 메서드에 ClientResponse의 인스턴스를 전달할 수 없습니다. 에 대한 메타 데이터가 모두ClientResponse입니다. 인스턴스를 전달한 경우 해당 메소드가 해당 인스턴스의 상태를 변경할 수도 있습니다. 그러나 모든 인스턴스에 대한 메타 데이터를 전달하면 메서드가 새로운 종류의 인스턴스 (예 : 동적 프록시)를 만들거나 ClientResponse의 모든 인스턴스에 대한 메타 데이터에 의존하는 다른 작업을 수행 할 수 있습니다. 차이점을 보시겠습니까?

1

클래스는 개체의 "청사진"입니다. 인스턴스는 객체입니다.

우리가

public class SomeClass { 
    int a; 
    SomeClass(int a) { 
     this.a = a 
    } 
} 

이있는 경우 우리는이 클래스

SomeClass c = new SomeClass(10); 

c의 인스턴스를 가질 수있는 것은 클래스의 인스턴스입니다. 값이 10a의 정수입니다.

개체 SomeClass.classClass을 나타냅니다. 여기 SomeClass.class

SomeClass

  1. 구상 클래스 생성자
  2. 하나
  3. 와 있다는 정보를 가지고 입력 Classobject정수 멤버 변수
  4. 및 많은 기타 metadata은 클래스 SomeClass에 관한 것입니다. a에 대한 값이 없음에 유의하십시오.

당신은 get(c)은 넣다 인스턴스의 데이터를/manupulate 얻기 위해 호출 c.a 또는 다른 유용한 기능처럼 cinstance 뭔가를 할 계획 사용해야합니다.

get이 인수가 어떤 유형의 클래스라는 사실에 근거하여 무언가를 반환 할 때는 get(SomeClass.class)을 사용해야합니다. 예를 들어,이 클래스가 전달 된 클래스 유형에 따라 implementation class을 가져 오는 Registry 클래스의 메소드 인 경우

2

가장 중요한 사실은 - 호출 할 인스턴스가 필요 없다는 것입니다. 방법. 어떤 이유로 클래스를 인스턴스화 할 수없는 상황에서 매우 유용합니다. 추상이거나 전용 생성자 만 있거나 Spring 또는 JSF와 같은 일부 프레임 워크에서만 올바르게 인스턴스화 될 수 있습니다.

당신은 심지어에서 온 않는 경우 알고 어떻게의 생성을 얻을하지 않고 요청 된 형식의 개체를 얻기 위해 get를 호출 할 수 있습니다. 우리가 어떤 자바 파일을 컴파일 할 때마다

0

는, 컴파일러는 방출 된 바이트 코드에서 유형 java.lang.Class의, class라는 public, static, final 필드를 포함합니다. 이 필드는 publicstatic이므로 클래스 이름과 함께 점으로 구분 된 표기법을 사용하여 액세스 할 수 있습니다 (예 : ClientResponse.class).