development

객체의 클래스를 결정하는 방법?

big-blog 2020. 2. 13. 00:46
반응형

객체의 클래스를 결정하는 방법?


클래스 B와 클래스가 클래스를 C확장 A하고 유형의 객체를 가지고 B있거나 C인스턴스 인 유형을 어떻게 알 수 있습니까?


if (obj instanceof C) {
//your code
}

Object.getClass ()를 사용하십시오 . 객체의 런타임 유형을 반환합니다.


여러 정답이 제시되었지만 여전히 더 많은 방법이 있습니다. Class.isAssignableFrom()단순히 객체를 캐스트하려고 시도하면 (을 던질 수 있음 ClassCastException)

가능한 방법 요약

객체 obj가 유형의 인스턴스 인지 테스트하는 가능한 방법을 요약 해 보겠습니다 C.

// Method #1
if (obj instanceof C)
    ;

// Method #2
if (C.class.isInstance(obj))
    ;

// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
    ;

// Method #4
try {
    C c = (C) obj;
    // No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}

// Method #5
try {
    C c = C.class.cast(obj);
    // No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}

null취급상의 차이

null그러나 처리 에는 차이가 있습니다 .

  • 처음 두 가지 방법에서 식은 is is ( 아무것도 아닌 false경우 obj)로 평가됩니다 .nullnull
  • 세 번째 방법은 NullPointerException분명히 던질 것 입니다.
  • 반대로 4 번째 및 5 번째 방법은 모든 유형으로 캐스트 할 수 null있기 때문에 수락 null합니다!

기억하기 : null 아니다 모든 유형의 인스턴스 있지만 캐스트 할 수 있는 유형.

노트

  • Class.getName()객체가 유형이 아닌 하위 클래스 인 경우 "is-instance-of" 테스트 베스 케이스 를 수행하는 데 사용해서는 안되며 C, 완전히 다른 이름과 패키지를 가질 수 있습니다 (따라서 클래스 이름이 분명히 일치하지 않음). 여전히 유형 C입니다.
  • 동일한 상속 이유 Class.isAssignableFrom()대칭 이 아닙니다 . 의 유형 이의 서브 클래스 인 경우
    obj.getClass().isAssignableFrom(C.class)반환 false됩니다 .objC

당신이 사용할 수있는:

Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object

HTH. 그러나 대부분의 경우 제어 흐름이나 이와 유사한 것에 사용하는 것이 좋지 않습니다 ...


제안 된 방법 중 하나를 사용하는 것은 잘못된 OO 설계에 기반한 코드 냄새로 간주됩니다.

당신의 디자인이 좋은 경우에, 당신은 자신이 사용할 필요 찾을 안 getClass()instanceof.

제안 된 방법 중 하나는 디자인 측면에서 명심해야 할 것입니다.


이 경우에는 반사를 사용할 수 있습니다

objectName.getClass().getName();

예:-

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String name = request.getClass().getName();
}

이 경우 객체가 HttpServletRequest인터페이스 참조 변수에 전달하는 클래스의 이름을 얻습니다 .


.isInstance" Class"클래스 에도 메소드 가 있습니다 . via myBanana.getClass()통해 객체의 클래스를 얻는 다면 객체 myApplemyBananavia 와 동일한 클래스의 인스턴스 인지 확인할 수 있습니다

myBanana.getClass().isInstance(myApple)

isinstance()런타임에 알고 싶다면 확인하는 것만으로는 충분하지 않습니다. 사용하다:

if(someObject.getClass().equals(C.class){
    // do something
}

참고 URL : https://stackoverflow.com/questions/541749/how-to-determine-an-objects-class



반응형