Estou brincando com a API de reflexão do Java e tentando lidar com alguns campos. Agora, eu estou preso em identificar o tipo dos meus campos. Cordas são fáceis, basta fazer myField.getType().equals(String.class)
. O mesmo se aplica a outras classes não derivadas. Mas como verifico classes derivadas? Por exemplo, LinkedList
como subclasse de List
. Não consigo encontrar qualquer isSubclassOf(...)
ou extends(...)
método. Preciso percorrer tudo getSuperClass()
e encontrar minha supeclasse sozinha?
java
class
reflection
craesh
fonte
fonte
LinkedList
não é uma subclasse deList
. É uma implementação deList
.Respostas:
Você deseja este método:
em geral,
List
(acima) deve ser substituído porsuperclass
emyClass
deve ser substituído porsubclass
No JavaDoc :
Referência:
Class.isAssignableFrom(Class)
Palavras-chave:
a) Verifique se um objeto é uma instância de uma classe ou interface (incluindo subclasses) que você conhece em tempo de compilação:
Exemplo:
b) Verifique se um Objeto é uma instância de uma Classe ou Interface (incluindo subclasses) que você conhece apenas em tempo de execução:
Exemplo:
fonte
SUPERCLASS.isAssignableFrom(SUBCLASS)
Isso me confundiu primeiro, embora seja realmente óbvio considerando o nome.SUPERCLASS.isExtendedBy(SUBCLASS)
seria muito mais fácil de entenderisExtendedBy
é um nome ruim, comoCLASS.isAssignableFrom(CLASS)
seria verdadeiro (e, portantoCLASS.isExtendedBy(CLASS)
, também). Isso não seria o que eu esperava.Outra opção é instanceof:
fonte
Class.isInstance(object)
download.oracle.com/javase/6/docs/api/java/lang/...Field
. Mas eu só quero "olhar" para a minha classe e seus campos, não quero "experimentá-los".instanceof
também trabalha para o pai (neste casoNumber
) se não só das criançasinstanceof funciona em instâncias, ou seja, em Objetos. Às vezes você deseja trabalhar diretamente com as aulas. Nesse caso, você pode usar o método asSubClass da classe Class. Alguns exemplos:
1)
isso ocorrerá sem problemas porque o JFrame é a subclasse de Object. c conterá um objeto Class que representa a classe JFrame.
2)
isso iniciará um java.lang.ClassCastException porque JFrame NÃO é uma subclasse de JButton. c não será inicializado.
3)
isso ocorrerá sem problemas porque o JFrame implementa a interface java.io.Serializable. c conterá um objeto Class que representa a classe JFrame.
Obviamente, as importações necessárias devem ser incluídas.
fonte
Isso funciona para mim:
fonte
Esta é uma versão aprimorada da resposta da @ schuttek. Ele foi aprimorado porque retorna corretamente false para primitivas (por exemplo, isSubclassOf (int.class, Object.class) => false) e também manipula corretamente interfaces (por exemplo, isSubclassOf (HashMap.class, Map.class) => true).
fonte
Um método recursivo para verificar se a
Class<?>
é uma subclasse de outraClass<?>
...Versão melhorada do @Ao Kra 's resposta :
fonte
//Herança
//Métodos
// Teste o código
//Resultado
fonte