Java에서 .class는 무엇을 의미합니까?


149

.classJava에서 무엇을 의미합니까? 예를 들어,이라는 클래스를 만든 경우 Print. 무엇을 Print.class반환합니까?



나는 당신이 무엇을 요구하는지 완전히 이해하지 못합니다. 좀 더 정교하게 만들 수 있다면, 누군가 더 유용한 정보를 제공 할 수있을 것입니다.
Paul Walker

28
이것은 확실히 나에게 진짜 질문처럼 보입니다. 방금이 질문을하고 있었고 빠른 Google 검색 후 여기에서 나 자신을 발견했습니다. 내 질문이 진짜가 아니라는 것을 알면 귀찮게해서는 안됩니다!
닥터 존스

1
또한 특정 검색 문자열이 어색하기 때문에이 질문에 대해 글을 쓰거나 찾을 수있는 것이 거의 없습니다. 위에 링크 된 API 문서 외에 다른 곳에서는 언급하지 않은 적이 있습니다 (반사에 자주 사용되는 것을 볼 수는 있지만).
jordanpg

2
@MadProgrammer OP는 파일 이름 확장자 .class와 우연히 관련된 구문 에 대해 묻습니다 .class.
jordanpg

답변:


143

당신이 쓸 때 .class- 클래스 이름 후에는 클래스 리터럴 참조하는 java.lang.Class객체 정보 표현 에 대해 지정된 클래스를.

예를 들어, 클래스 인 경우 Print, 다음 Print.class클래스 나타내는 개체입니다 Print런타임에 있습니다. 의 getClass()(직접) 인스턴스의 메소드에 의해 리턴되는 동일한 오브젝트 입니다 Print.

Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());

2
클래스 객체로 할 수있는 일은 무엇입니까?
케빈

7
@Kevin java.lang.Class API 문서를 참조하십시오 .
Patricia Shanahan

애플리케이션 : 개인 필드에 액세스합니다 (예 :) Writer.class.getDeclaredField("writeBuffer").
jordanpg

2
그래서 유형은 Print.class무엇입니까?
Zhipeng YANG

1
그리고 안드로이드는 new Intent(this, Activity.class어떻게 처리 합니까? class Activity각 수업을 비교 하여 알아 내려고 합니까?
Zhipeng YANG

56

.class 사용 가능한 클래스의 인스턴스가 없을 때 사용됩니다.

.getClass() 사용 가능한 클래스의 인스턴스가있을 때 사용됩니다.

object.getClass() 주어진 객체의 클래스를 반환합니다.

예를 들면 다음과 같습니다.

String string = "hello";
System.out.println(string.getClass().toString());

출력됩니다 :

class java.lang.String

이것은 문자열 객체의 클래스입니다 :)


7
getClass()클래스의 객체를 가리키는 참조가있는 경우에만 유용합니다. ClassName.class클래스에 인스턴스가없는 경우에도 사용할 수 있습니다. 예를 들어을 고려하십시오 Math.class. 특정 상황에 적합합니다.
Patricia Shanahan

훌륭한 설명. 오른쪽 당신이 사이의 차이를 확인하는 방법 it.Love의 포인트 .class.getClass().
Sevastyan Savanyuk

6

객체의 인스턴스가 사용 가능한 경우 클래스를 얻는 가장 간단한 방법은 호출하는 것입니다. Object.getClass()

.class구문

유형이 사용 가능하지만 인스턴스가없는 경우 .class유형의 이름을 추가 하여 클래스를 얻을 수 있습니다. 이것은 또한 기본 유형에 대한 클래스를 얻는 가장 쉬운 방법입니다.

boolean b;
Class c = b.getClass();   // compile-time error

Class c = boolean.class;  // correct

클래스에 대한 docs.oracle.com 참조


6

명확히하기 위해이 '.class'메소드는 Java 코드를 컴파일 한 후 표시되는 바이트 코드 파일이나 OOP 이론의 Class vs. Object 개념 사이의 혼란을 언급하지 않습니다.

이 '.class'메소드는 Java에서 코드 리플렉션에 사용됩니다. 일반적으로 정규화 된 클래스 이름, 상수 목록, 공용 필드 목록 등과 같은 클래스의 메타 데이터를 수집 할 수 있습니다.


https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html https://docs.oracle.com/javase/8/docs 링크를 확인하십시오 (이미 언급 됨).
/api/java/lang/Class.html

일반적으로 프로젝트 빌드를 시작할 때 리플렉션을 즉시 사용할 계획이 없습니다. 이미 작동하는 코드를 관리하려고 시도한 후에 필요한 것입니다. 프로그램의 여러 인스턴스를 관리하려면 여러 번 필요합니다. 특정 '복제본'을 식별하여 무언가가 이미 정의되어 있는지 확인하거나 함수 수를 계산하거나 단순히 클래스의 특정 인스턴스에 대한 세부 정보를 기록하려고 할 수 있습니다.


3

사용 가능한 인스턴스가없는 경우 .class구문은 클래스의 해당 Class 객체를 가져 오는 데 사용됩니다. 그렇지 않으면 getClass () 메서드를 사용하여 Class 객체를 가져올 수 있습니다. 기본 데이터 유형의 인스턴스가 없으므로 기본 데이터 유형에 .class구문 을 사용해야 합니다.

    package test;

    public class Test {
       public static void main(String[] args)
       {
          //there is no instance available for class Test, so use Test.class
          System.out.println("Test.class.getName() ::: " + Test.class.getName());

          // Now create an instance of class Test use getClass()
          Test testObj = new Test();
          System.out.println("testObj.getClass().getName() ::: " + testObj.getClass().getName());

          //For primitive type
          System.out.println("boolean.class.getName() ::: " + boolean.class.getName());
          System.out.println("int.class.getName() ::: " + int.class.getName());
          System.out.println("char.class.getName() ::: " + char.class.getName());
          System.out.println("long.class.getName() ::: " + long.class.getName());
       }
    }

1

여기서 핵심은 클래스와 객체의 차이점을 이해하는 것입니다. 객체는 클래스의 인스턴스입니다. 그러나 완전한 객체 지향 언어에서 Class는 Object 입니다. 따라서 호출 .class은 해당 클래스의 클래스 객체에 대한 참조를 가져 와서 조작 할 수 있습니다.


4
in a fully object-oriented language, a Class is also an Object? <인용 필요>
Sam Dufel

0

클래스 리터럴은 클래스 이름, 인터페이스, 배열 또는 기본 유형 또는 의사 유형의 공백과 '.'로 구성되는 표현식입니다. 그리고 토큰 클래스. JDK 5.0의 변경 사항 중 하나는 java.lang.Class 클래스가 일반 java.lang.Class Class<T>이므로 다음과 같습니다.

Class<Print> p = Print.class;

여기에 참조 :

https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

http://docs.oracle.com/javase/tutorial/extra/generics/literals.html

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.2

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.