[java] Class 객체 (java.lang.Class) 란 무엇입니까?

에 대한 Java 문서 Class는 다음과 같습니다.

Class객체는 클래스가로드 될 때 Java Virtual Machine에 의해 그리고 defineClass클래스 로더 의 메소드에 대한 호출에 의해 자동으로 구성됩니다 .

Class물건 들은 무엇입니까 ? 호출하여 클래스에서 인스턴스화 된 객체와 동일 new합니까?

또한 예를 들어 내가 상속하지 않더라도 object.getClass().getName()어떻게 모든 것을 superclass로 형변환 할 수 있습니까?Classjava.lang.Class



답변

아무것도 형변환되지 않습니다 Class. ObjectJava의 모든 것은 특정 class. 이것이 Object다른 모든 클래스에 상속 된 클래스가 getClass()메서드를 정의하는 이유 입니다.

getClass()또는 class-literal- 클래스에 대한 일부 메타 데이터를 포함 Foo.class하는 Class객체를 반환합니다 .

  • 이름
  • 꾸러미
  • 행동 양식
  • 필드
  • 생성자
  • 주석

주조 및 각종 검사와 같은 몇 가지 유용한 방법 ( isAbstract(), isPrimitive(), 등). javadoc 은 클래스에 대해 얻을 수있는 정보를 정확히 보여줍니다.

예를 들어, 당신의 메서드에 객체가 주어지고 주석으로 @Processable주석 이 달린 경우 처리하려면 다음을 수행하십시오.

public void process(Object obj) {
    if (obj.getClass().isAnnotationPresent(Processable.class)) {
       // process somehow; 
    }
}

이 예에서는 주어진 객체의 클래스에 대한 메타 데이터를 얻고 (무엇이든) 주어진 주석이 있는지 확인합니다. Class인스턴스 에 대한 많은 메서드를 “반사 연산”또는 간단히 “반사”라고합니다. 여기에서 리플렉션이 사용되는 이유와시기에 대해 읽어보십시오 .

것이 주 Class목적은 실행중인 Java 응용 프로그램의 클래스와 함께 열거하고 intefaces을 나타내며, 각각의 메타 데이터를 가지고있다.

요약하자면 자바의 각 객체는 클래스에 속하며 Class런타임에 액세스 할 수 있는 해당 객체에 대한 메타 데이터를 포함하고 있습니다.


답변

Class 객체는 객체의 클래스를 설명하는 일종의 메타 객체입니다. 주로 Java의 리플렉션 기능과 함께 사용됩니다. 실제 클래스의 “청사진”이라고 생각할 수 있습니다. 예를 들어 다음과 같은 클래스 Car가 있습니다.

public class Car {
    public String brand;
}

그런 다음 “Car”클래스를 설명하는 Class 객체를 생성 할 수 있습니다.

Class myCarClass = Class.forName("Car");

이제 해당 Class 객체의 Car 클래스에 대해 모든 종류의 쿼리를 수행 할 수 있습니다.

myCarClass.getName() - returns "Car"
myCarClass.getDeclaredField("brand") - returns a Field object describing the "brand" field

등등. 모든 Java 객체에는 Java 객체의 클래스를 설명하는 Class 객체를 반환하는 getClass () 메소드가 있습니다. 따라서 다음과 같이 할 수 있습니다.

Car myCar = new Car();
Class myCarClass  = myCar.getClass();

이것은 또한 당신이 모르는 개체, 예를 들어 외부에서 얻은 개체에 대해서도 작동합니다.

public void tellMeWhatThisObjectsClassIs(Object obj) {
    System.out.println(obj.getClass().getName());
}

이 메소드에 모든 자바 객체를 공급할 수 있으며 주어진 객체의 실제 클래스를 인쇄합니다.

Java로 작업 할 때 대부분의 경우 Class 객체에 대해 걱정할 필요가 없습니다. 하지만 몇 가지 편리한 사용 사례가 있습니다. 예를 들어 객체 직렬화 및 역 직렬화에 자주 사용되는 특정 클래스의 객체를 프로그래밍 방식으로 인스턴스화 할 수 있습니다 (예 : Java 객체를 XML 또는 JSON으로 / 뒤로 변환).

Class myCarClass = Class.forName("Car");
Car myCar = myCarClass.newInstance();  // is roughly equivalent to = new Car();

특정 경우에 매우 유용한 클래스 등의 선언 된 모든 필드 또는 메서드를 찾는 데 사용할 수도 있습니다. 예를 들어 메서드가 알 수없는 객체를 전달 받고 이에 대해 더 많이 알아야하는 경우 (예 : 일부 인터페이스를 구현하는 경우) Class 클래스가 여기에서 친구가됩니다.

간단히 말해서 java.lang.reflect 패키지에있는 클래스, 필드, 메소드 등의 클래스를 사용하면 정의 된 클래스, 메소드, 필드를 분석하고 이들의 새 인스턴스를 생성하고 모든 종류의 기타 항목을 호출 할 수 있습니다. 런타임에이를 동적으로 수행 할 수 있습니다.


답변

getClass()… 의 인스턴스 인 객체 를 반환 하는 메서드입니다 java.lang.Class. 캐스팅이 필요하지 않습니다. 캐스팅은 다음과 같습니다.

Class<?> type = (Class<?>) object;


답변

또한 getClass가 동일한 유형의 인스턴스에 대해 동일한 객체 를 반환한다는 ColinD의 답변에 추가하고 싶습니다 . 이것은 true 를 인쇄 합니다 .

    MyOtherClass foo = new MyOtherClass();
    MyOtherClass bar = new MyOtherClass();
    System.out.println(foo.getClass()==bar.getClass());

참고가 아니라고 equals, 내가 사용하고 있습니다 ==.


답변

Class 객체는 Class (java.lang.Class)의 인스턴스입니다. 클래스의 javadoc에서 가져온 아래 인용문이 귀하의 질문에 답해야합니다.

클래스에는 공용 생성자가 없습니다. 대신 클래스 객체는 클래스가로드 될 때 Java 가상 머신에 의해 자동으로 생성되고 클래스 로더에서 defineClass 메소드를 호출합니다.


답변

클래스 객체를 완전히 이해하려면 다시 들어가서 우리가 처음에 클래스 객체를 얻는다는 것을 이해하십시오. .java생성 한 모든 파일 은 해당 .java파일 을 컴파일 할 때 jvm .class이 파일을 생성 합니다.이 파일에는 클래스에 대한 모든 정보가 포함됩니다.

  1. 클래스의 완전한 이름
  2. 클래스의 부모
  3. 방법 정보
  4. 가변 필드
  5. 건설자
  6. 수정 자 정보
  7. 상수 풀

위에 보이는 목록은 일반적인 수업에서 일반적으로 볼 수있는 것입니다. 이제이 시점까지 .java파일과 .class파일이 하드 디스크에 존재합니다. 실제로 클래스를 사용해야 할 때 (예 : main()메소드에서 코드 실행) jvm은 .class하드 드라이브에서 해당 파일을 사용하여 5 개 메모리 중 하나에로드합니다. .class메소드 영역 인 jvm의 영역 은 파일을 메소드 영역에 로드 한 직후 jvm이 해당 정보와 힙 메모리 영역에 존재 하는 해당 클래스를 나타내는 Class 객체를 사용합니다 .

다음은 최상위 뷰입니다.

.java–compile-> .class-> 스크립트를 실행할 때-> .class메서드 영역으로로드 –jvm은 메서드 영역에서 클래스 객체를 생성합니다-> 클래스 객체가 생성됩니다.

클래스 개체를 사용하면 클래스 이름, 메서드 이름, 클래스에 대한 모든 정보를 얻을 수 있습니다.

또한 명심해야 할 점은 스크립트에서 사용하는 모든 클래스에 대해 하나의 클래스 객체 만 있어야한다는 것입니다.

이것이 이해되기를 바랍니다.


답변

Object 클래스는 기본적으로 java에있는 모든 클래스의 상위 클래스입니다. 즉, Java의 최상위 클래스입니다.

Object 클래스는 유형을 모르는 객체를 참조하려는 경우 유용합니다. 상위 클래스 참조 변수는 업 캐스팅으로 알려진 하위 클래스 객체를 참조 할 수 있습니다.

예를 들어 객체를 반환하는 getObject () 메서드가 있지만 Employee, Student 등과 같은 모든 유형이 될 수 있습니다. Object 클래스 참조를 사용하여 해당 객체를 참조 할 수 있습니다. 예를 들면 :

Object obj=getObject(); //이 메서드에서 어떤 객체가 반환되는지 알 수 없습니다.