Program Tip

런타임에 하위 클래스가 클래스의 인스턴스인지 확인하는 방법은 무엇입니까?

programtip 2020. 11. 6. 19:07
반응형

런타임에 하위 클래스가 클래스의 인스턴스인지 확인하는 방법은 무엇입니까?


Android 앱 테스트 스위트 B에는 뷰가있는 다음과 같은 클래스 가 있습니다.

public class A extends B {
... etc...
}

이제 개체를 포함 할 수있는 뷰 개체 목록 A이 있지만이 경우에는 하위 클래스 또는 "인스턴스"인 경우에만 관심이 B있습니다. 다음과 같은 작업을하고 싶습니다.

ArrayList<View> viewList = getViews();
Iterator<View> iterator = viewList.iterator();
while (iterator.hasNext() && viewList != null) {
    View view = iterator.next();
    if (view.getClass().isInstance(B.class)) {
        // this is an instance of B
    }
}

문제는 객체를 if만날 A"인스턴스"로 평가되지 않는다는 것 B입니다. 할 방법이 isSubclassOf있나요?


이 메서드에 대한 API를주의 깊게 읽어야합니다. 때로는 매우 쉽게 혼동 될 수 있습니다.

다음 중 하나입니다.

if (B.class.isInstance(view))

API 말한다 : 지정된 개체 (매개 변수) 가이 클래스 (메소드를 호출하는 클래스 개체 ) 가 나타내는 개체와 할당 호환되는지 확인합니다.

또는:

if (B.class.isAssignableFrom(view.getClass()))

API 말한다 :이 Class 객체 가 나타내는 클래스 또는 인터페이스가 지정된 Class 매개 변수가 나타내는 클래스 또는 인터페이스와 동일하거나 수퍼 클래스 또는 수퍼 인터페이스인지 판별합니다.

또는 (반성과 추천하지 않고) :

if (view instanceof B)

if(view instanceof B)

뷰가 B 또는 하위 클래스 A (또는 해당 문제에 대한 B의 하위 클래스)의 인스턴스 인 경우 true를 반환합니다.


아마도 내가 뭔가를 놓치고 있지만 이것으로 충분하지 않을 것입니다.

if (view instanceof B) {
    // this view is an instance of B
}

Class.isAssignableFrom()-인터페이스에서도 작동합니다. 원하지 않으면에 getSuperclass()도달 할 때까지 전화를 걸어 테스트 해야합니다 Object.


다른 방법은 다음과 같습니다. B.class.isInstance(view)


SQLRecoverableException vs SQLException 검사와 같은 다형성이 있다면 그렇게 할 수 있습니다.

try {
    // sth may throw exception
    ....
} catch (Exception e) {
    if(SQLException.class.isAssignableFrom(e.getCause().getClass()))
    {
        // do sth
        System.out.println("SQLException occurs!");
    }
}

간단히 말해

ChildClass child= new ChildClass();
if(ParentClass.class.isAssignableFrom(child.getClass()))
{
    // do sth
    ...
}

나는 이것을 실제로 사용한 적이 없지만 view.getClass().getGenericSuperclass()

참고 URL : https://stackoverflow.com/questions/2410304/how-to-check-if-a-subclass-is-an-instance-of-a-class-at-runtime

반응형