Java 코드를 작성할 때 소스 파일의 이름은 java라는 접미사로 지정됩니다. Java 파일이 컴파일된 후에는 .class 접미사로 이름이 지정됩니다. Java 가상 머신이 클래스 파일을 기록할 때 이러한 파일은 다음과 같습니다. 해당 클래스의 다양한 구조와 데이터를 나타내기 위해 특정 데이터 구조가 존재해야 합니다. 이 구조 형태는 클래스 에 대한 설명인 클래스 개체입니다. Object는 Class 객체의 인스턴스화 결과입니다. JVM에는 Class 객체의 복사본이 하나만 있습니다(동일한 ClassLoader에 의해 로드되고 JVM의 고정 메모리 영역에 배치되며 GC는 관리하지 않습니다). it), 그러나 여러 개의 다른 인스턴스 객체가 있을 수 있습니다
클래스 메소드는 특정 인스턴스의 데이터와 상태에 의존하기 때문에 호출되기 전에 특정 인스턴스에 의존해야 합니다(정적 메소드 제외) ~~
Class은 클래스 객체이며 Object에서도 상속됩니다. 이 클래스 개체는 특정 인스턴스 개체와는 상당히 다릅니다. 일반적으로 클래스에는 하나의 클래스 개체만 있는데 Just.class을 통해 얻을 수 있습니다(이것은 메서드 중 하나이며 거의 세 가지 메서드가 있습니다). . new 또는 newInstance을 사용하여 여러 인스턴스 개체를 만들 수 있습니다. 반영 입문 지식을 피험자가 읽고, 그 후 반성의 기초가 되는 클래스 객체의 개념을 스스로 이해하는 것이 좋습니다.
우선 클래스 정보를 추상화하는 데 사용됩니다. 예를 들어 사람 클래스는 이름, 성별, 나이 등과 같은 정보를 추상화할 수 있습니다. 클래스, 자바의 클래스 추상화 패키지 이름, 클래스 이름, 속성 배열, 메소드 배열 등의 정보를 추상화한 클래스 클래스가 되었습니다. 이는 더 높은 수준의 추상화입니다. 이것은 반사를 더 쉽게 이해하게 해줍니다. Class<?> c = Just.class; 여기서는 Class의 객체입니다. 이 객체 인스턴스에는 Just 클래스가 포함되어 있지만 Just 클래스의 인스턴스를 얻으려면 , 단지 c.newInstance() 메소드도 호출해야 합니다.
여기에 두 가지 질문이 있습니다. 첫 번째 질문은 인스턴스와 클래스 간의 관계에 관한 것입니다. 이것은 틀과 제품의 관계와 같습니다. 예를 들어 케이크 틀을 사용하는 것은 수업과 같습니다. 이것은 제품입니다. 금형의 기능은 각 케이크의 크기와 기타 속성을 동일하게 만드는 것입니다. 반영이라는 개념은 좀 더 복잡합니다. 금형 자체에도 금형의 크기와 깊이 등의 속성이 있으며, 클래스 자체에는 어떤 메서드와 속성이 있는지 설명합니다. 이러한 사항을 알고 있으면 개체를 동적으로 인스턴스화할 수 있습니다. 이 몰드의 속성 동작을 알고 나면 동적으로 케이크를 생성하고 이 케이크의 메서드를 호출할 수도 있습니다. 두 번째 질문: 리플렉션을 사용하려면 객체의 인스턴스화가 필요하기 때문에 new가 사용되지 않더라도 여전히 그렇습니다. 인스턴스화해야 합니다. 그렇지 않으면 널 포인터가 보고됩니다.
Java 코드를 작성할 때 소스 파일의 이름은 java라는 접미사로 지정됩니다. Java 파일이 컴파일된 후에는 .class 접미사로 이름이 지정됩니다.
Java 가상 머신이 클래스 파일을 기록할 때 이러한 파일은 다음과 같습니다. 해당 클래스의 다양한 구조와 데이터를 나타내기 위해 특정 데이터 구조가 존재해야 합니다. 이 구조 형태는 클래스
에 대한 설명인 클래스 개체입니다. Object는 Class 객체의 인스턴스화 결과입니다. JVM에는 Class 객체의 복사본이 하나만 있습니다(동일한 ClassLoader에 의해 로드되고 JVM의 고정 메모리 영역에 배치되며 GC는 관리하지 않습니다). it), 그러나 여러 개의 다른 인스턴스 객체가 있을 수 있습니다
클래스 메소드는 특정 인스턴스의 데이터와 상태에 의존하기 때문에 호출되기 전에 특정 인스턴스에 의존해야 합니다(정적 메소드 제외) ~~
클래스 객체 클래스 및 메소드 객체 메소드도 객체이며 고유한 속성과 메소드를 갖습니다.
클래스가 객체로 인스턴스화될 때만 해당 객체의 인스턴스 메서드를 호출할 수 있습니다. Class 객체는 Class 클래스의 인스턴스입니다.
클래스 객체는 클래스 자체가 아니며, 실제 클래스에 접근하기 위한 인터페이스라고 생각하면 됩니다.
인스턴스 메서드를 호출하려면 해당 클래스의 인스턴스가 필요합니다. 정적 메서드를 호출할 때 null을 전달할 수 있습니다.
1. 명확하게 설명할 수 없습니다
2. 이 메서드는 인스턴스화된 개체가 없으면 호출할 수 없습니다.
Class
은 클래스 객체이며Object
에서도 상속됩니다. 이 클래스 개체는 특정 인스턴스 개체와는 상당히 다릅니다. 일반적으로 클래스에는 하나의 클래스 개체만 있는데Just.class
을 통해 얻을 수 있습니다(이것은 메서드 중 하나이며 거의 세 가지 메서드가 있습니다). .new
또는newInstance
을 사용하여 여러 인스턴스 개체를 만들 수 있습니다.반영 입문 지식을 피험자가 읽고, 그 후 반성의 기초가 되는 클래스 객체의 개념을 스스로 이해하는 것이 좋습니다.
클래스는 객체의 추상화이고, 객체는 객관적인 것의 추상입니다
우선 클래스 정보를 추상화하는 데 사용됩니다. 예를 들어 사람 클래스는 이름, 성별, 나이 등과 같은 정보를 추상화할 수 있습니다. 클래스, 자바의 클래스 추상화 패키지 이름, 클래스 이름, 속성 배열, 메소드 배열 등의 정보를 추상화한 클래스 클래스가 되었습니다. 이는 더 높은 수준의 추상화입니다.
이것은 반사를 더 쉽게 이해하게 해줍니다. Class<?> c = Just.class; 여기서는 Class의 객체입니다. 이 객체 인스턴스에는 Just 클래스가 포함되어 있지만 Just 클래스의 인스턴스를 얻으려면 , 단지 c.newInstance() 메소드도 호출해야 합니다.
여기에 두 가지 질문이 있습니다.
첫 번째 질문은 인스턴스와 클래스 간의 관계에 관한 것입니다. 이것은 틀과 제품의 관계와 같습니다. 예를 들어 케이크 틀을 사용하는 것은 수업과 같습니다. 이것은 제품입니다. 금형의 기능은 각 케이크의 크기와 기타 속성을 동일하게 만드는 것입니다. 반영이라는 개념은 좀 더 복잡합니다. 금형 자체에도 금형의 크기와 깊이 등의 속성이 있으며, 클래스 자체에는 어떤 메서드와 속성이 있는지 설명합니다. 이러한 사항을 알고 있으면 개체를 동적으로 인스턴스화할 수 있습니다. 이 몰드의 속성 동작을 알고 나면 동적으로 케이크를 생성하고 이 케이크의 메서드를 호출할 수도 있습니다.
두 번째 질문: 리플렉션을 사용하려면 객체의 인스턴스화가 필요하기 때문에 new가 사용되지 않더라도 여전히 그렇습니다. 인스턴스화해야 합니다. 그렇지 않으면 널 포인터가 보고됩니다.
문제가 해결된 것을 보니 그래도 메모리 구조 수준에서 뭔가를 추가하고 싶습니다.
인스턴스의 힙 메모리 구조를 살펴보겠습니다.
즉, 각 객체 인스턴스는 힙 메모리의 4개 부분으로 구성됩니다. 마크 단어(mark 단어)와
Class
인스턴스 포인터에 초점을 맞춰 보겠습니다. 마크 단어에는 잠금 유무, GC 플래그, Youth가 포함됩니다. GC 시간 등 정보.Class
인스턴스는Classloader
에 의해 jvm에 로드된 클래스를 나타냅니다. 이 클래스의 설명 정보, 클래스 이름, 필드 이름 및 메서드 정보를 저장합니다.따라서 포스터의 문제는 분명합니다.
Class
인스턴스는 클래스의 설명 정보만 나타낼 뿐이며 클래스의 인스턴스와 동일하지 않으며 각 인스턴스에는Class
인스턴스에 대한 포인터 참조가 포함됩니다.일반적으로
Class.newInstance()
에 전화하면 3가지 작업이 수행됩니다.1. 힙 메모리 공간을 엽니다
2. 해당 클래스의 인수 없는 생성자를 호출합니다
3. 스택 주소를 적용하고 이 힙 메모리 공간을 참조 주소로 지정합니다
또한,
Class
의 인스턴스화는classloader
의define()
메소드로 수행됩니다.