Java에서 a.getClass()와 A.class의 차이점은 무엇입니까?
에서는 어떤요?a.getClass()
★★★★★★★★★★★★★★★★★」A.class
할 수 Class<?>
에서 둘 다나 기타 이 있을 됩니다.Class.forName()
★★★★★★★★★★★★★★★★★」ClassLoader.loadClass()
.
목적이 다르고 둘 사이에 "선택"이 거의 없기 때문에 장단점 측면에서 비교하지 않을 것입니다.
a.getClass()
의 런타임 유형을 반환합니다.a
「 」가 는, 「 」가 있습니다.A a = new B();
a.getClass()
will will will 。B
를 누릅니다A.class
평가하다A
정적인 클래스이며, 종종 반사와 관련된 다른 목적으로 사용됩니다.
퍼포먼스 면에서는 측정 가능한 차이가 있을 수 있지만 결국 JVM이나 컴파일러에 의존하기 때문에 이에 대해서는 언급하지 않겠습니다.
이 게시물은 여기 기사로 고쳐졌습니다.
실제로 사용할 수 있는 위치에 따라 다릅니다. A.class
합니다.a.getClass()
에는 타입의 합니다.A
실행 시 동작합니다.
퍼포먼스에도 차이가 있을 수 있습니다.한편, 「 」는, 「 」, 「 」의 사이에A.class
있기 할 수 .A
,a.getClass()
는 실행 시 발생하는 가상 메서드콜입니다
바이트 으로 다음과 합니다.Integer.getClass()
:
aload_1
invokevirtual #3; //Method java/lang/Object.getClass:()Ljava/lang/Class;
.Integer.class
:
//const #3 = class #16; // java/lang/Integer
ldc_w #3; //class java/lang/Integer
전자는 일반적으로 가상 방식의 디스패치를 수반하기 때문에 실행에 시간이 더 걸릴 수 있습니다.그러나 이는 결국 JVM에 의존합니다.
아래의 예를 보다
a.getClass()!= A.class
인 A의 입니다.
a.getClass()
에는 타입 A의합니다.
a.getClass
그 인스턴스의 . , 「클래스/타입」은 「클래스/타입」입니다.a.class
때 합니다.type
사용 가능한 경우 해당 인스턴스를 생성하려고 합니다.
한 also도.getClass()
of 、 음음 while while while while while while while while while while while while while while while while while while인스턴스 합니다..class
는 컴파일 시에 평가됩니다.
를 getClass()
....class
,.class
이 좋다getClass()
.
예:
public class PerfomanceClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
long time=System.nanoTime();
Class class1="String".getClass();
class1="String".getClass();
class1="String".getClass();
class1="String".getClass();
System.out.println("time (getClass()) :"+(System.nanoTime()-time)+" ns");
long time2=System.nanoTime();
Class class2=String.class;
class2=String.class;
class2=String.class;
class2=String.class;
System.out.println("time (.class):"+(System.nanoTime()-time2)+" ns");
}
}
출력:
time (getClass()) : 79410 ns
time (.class) : 8032 ns
하나 더 추가하고 싶은 차이가 있습니다.예를 들어, 아래 그림과 같이 Class 객체를 사용하는 슈퍼 클래스와 함께 생성자 클래스가 있다고 가정해 보겠습니다.서브클래스 오브젝트가 생성될 때마다 서브클래스의 클래스 오브젝트가 슈퍼클래스로 전달되도록 할 필요가 있습니다.아래 코드는 생성자에서 인스턴스 메서드를 호출할 수 없으므로 컴파일되지 않습니다.이 경우, 당신이 교체한다면myObject.getClass()
와 함께MyClass.class
완벽하게 동작합니다.
Class MyClass
{
private MyClass myObject = new MyClass();
public MyClass()
{
super(myObject.getClass()); //error line compile time error
}
}
흥미롭게도 위의 예에서 언급한 성능 차이는 다른 이유와 관련이 있는 것으로 보입니다.3개의 다른 클래스를 사용하면 평균 성능은 거의 동일합니다.
import java.util.LinkedHashMap;
public class PerfomanceClass {
public static void main(String[] args) {
long time = System.nanoTime();
Class class1 = "String".getClass();
Class class11 = "Integer".getClass();
Class class111 = "LinkedHashMap".getClass();
System.out.println("time (getClass()) :" + (System.nanoTime() - time) + " ns");
long time2 = System.nanoTime();
Class class2 = String.class;
Class class22 = Integer.class;
Class class222 = LinkedHashMap.class;
System.out.println("time (.class):" + (System.nanoTime() - time2) + " ns");
} }
출력은 다음과 같습니다.
time (getClass()) :23506 ns
time (.class):23838 ns
게다가 콜의 순서를 바꾸면,getClass()
더 빨라지고 있어요.
import java.util.LinkedHashMap;
public class PerfomanceClass {
public static void main(String[] args) {
long time2 = System.nanoTime();
Class class2 = LinkedHashMap.class;
System.out.println("time (.class):" + (System.nanoTime() - time2) + " ns");
long time = System.nanoTime();
Class class1 = "LinkedHashMap".getClass();
System.out.println("time (getClass()) :" + (System.nanoTime() - time) + " ns");
}}
출력:
time (.class):33108 ns
time (getClass()) :6622 ns
p.getClass()
, 여기서p
객체의 인스턴스이며 이 객체의 런타임 클래스를 반환합니다.p
.p
컴파일 시간 오류를 일으키는 유형일 수 없습니다. 객체의 인스턴스여야 합니다.
// B extends A
A a = new B();
System.out.println(a.getClass());
//output: class B
p.class
표현입니다.그.class
는 클래스 구문이라고 불립니다. p
는 타입입니다.클래스, 인터페이스 또는 배열의 이름일 수도 있고 원시 유형일 수도 있습니다. a.getClass() == B.class
수 있는 할 수 .getClass
메서드를 사용하여 유형 이름을 가져옵니다. 이외의 경우는, 「」를 합니다..class
변경
언급URL : https://stackoverflow.com/questions/10947768/what-is-the-difference-between-a-getclass-and-a-class-in-java
'programing' 카테고리의 다른 글
마리아답은 시동이 걸리지 않는다.제어 프로세스가 종료되었습니다. (0) | 2022.10.05 |
---|---|
PHP에서 현재 함수의 이름을 검색하는 중 (0) | 2022.10.05 |
C구조를 인라인으로 할당하려면 어떻게 해야 합니까? (0) | 2022.10.05 |
Object.getOwnPropertyNames와 Object.열쇠들. (0) | 2022.10.05 |
모든 호스트에서 MySQL 루트 액세스 (0) | 2022.10.05 |