Como testar se uma classe java estende outra em tempo de execução?

Respostas:

255

Você está procurando:

Super.class.isAssignableFrom(Sub.class)
Meriton
fonte
84

Se você quiser saber se um Classestende outro, use Class # isAssignableFrom (Class) . Para o seu exemplo, seria:

if(B.class.isAssignableFrom(A.class)) { ... }

Se você estiver interessado em saber se uma instância é ou não de um tipo específico, use instanceof:

A obj = new A();
if(obj instanceof B) { ... }

Observe que eles retornarão truese a classe / instância for um membro da hierarquia de tipos e não for restritivo para direcionar os relacionamentos de superclasse / subclasse. Por exemplo:

// if A.class extends B.class, and B.class extends C.class
C.class.isAssignableFrom(A.class); // evaluates to true
// ...and...
new A() instanceof C; // evaluates to true

Se você deseja verificar os relacionamentos diretos de superclasse / subclasse, Tim também forneceu uma resposta .

Rob Hruska
fonte
2
Na verdade, B.class.isAssignableFrom (A.class), já que ele quer saber se A é uma subclasse de B.
meriton
1
Ah sim, eu vou mudar isso. Normalmente, os exemplos são o contrário (B estendendo A).
Rob Hruska
enganado ya ;-p Muito obrigado pela resposta detalhada; Estou aceitando o Meriton, porém, como é o IMO mais claro.
Armand
42

Você quer saber se b é atribuível a partir de a :

b.isAssignableFrom(a);

Além disso, se você quiser saber que aé uma subclasse direta de b:

a.getSuperclass().equals(b);
Tim Stone
fonte
Obrigado pela resposta, e obrigado por utilizar ae bda questão
Armand