Estou um pouco confuso sobre a diferença entre o getFields
método e o getDeclaredFields
método ao usar a reflexão em Java.
Eu li que getDeclaredFields
lhe dá acesso a todos os campos da classe e que getFields
apenas retorna campos públicos. Se for esse o caso, por que você não usaria sempre getDeclaredFields
?
Alguém pode, por favor, elaborar isso e explicar a diferença entre os dois métodos, e quando / por que você gostaria de usar um sobre o outro?
java
reflection
BlackHatSamurai
fonte
fonte
getField
pode obter um campo herdado de uma superclasse, masgetDeclaredField
não pode.getDeclaredField
restringir-se à classe na qual você chama a função.getField
não pode acessar membros privadosRespostas:
getFields ()
Todos os
public
campos em toda a hierarquia de classes.getDeclaredFields ()
Todos os campos, independentemente de sua acessibilidade, mas apenas para a classe atual, não quaisquer classes base das quais a classe atual possa estar herdando.
Para obter todos os campos na hierarquia, escrevi a seguinte função:
A
exclusiveParent
classe é fornecida para impedir a recuperação de camposObject
. Pode sernull
que você queira osObject
campos.Para esclarecer,
Lists.newArrayList
vem da goiaba.Atualizar
Para sua informação, o código acima é publicado no GitHub no meu projeto LibEx no ReflectionUtils .
fonte
Field#get
métodos semelhantes. Em outras palavras, essa abordagem não permite que a classe atual acesse a interface privada de sua superclasse, da mesma forma que a compilação típica não.setAccessible
e não há Security Manager no lugarprivate
campos só podem ser acessados através dogetDeclaredFields
qual é específico da classe. Cada campo (mesmo com o mesmo tipo e nome) seriaField
instâncias distintas .Como já mencionado,
Class.getDeclaredField(String)
apenas analisa os camposClass
nos quais você o chama.Se você deseja pesquisar um
Field
naClass
hierarquia, pode usar esta função simples:Isso é útil para encontrar um
private
campo de uma superclasse, por exemplo. Além disso, se você quiser modificar seu valor, poderá usá-lo assim:fonte
try try { field = clazz.getDeclaredField(name); } catch (NoSuchFieldException e) { clazz = clazz.getSuperclass(); if(clazz==null){ throw e; } }
public Field[] getFields() throws SecurityException
Retorna uma matriz contendo objetos de campo que refletem todos os campos públicos acessíveis da classe ou interface representada por esse objeto de classe. Os elementos na matriz retornados não são classificados e não estão em nenhuma ordem específica. Esse método retorna uma matriz de comprimento 0 se a classe ou a interface não tiver campos públicos acessíveis ou se ela representa uma classe de matriz, um tipo primitivo ou nulo.
Especificamente, se esse objeto Class representar uma classe, esse método retornará os campos públicos dessa classe e de todas as suas superclasses. Se esse objeto Class representar uma interface, esse método retornará os campos dessa interface e de todas as suas superinterfaces.
O campo de comprimento implícito para a classe da matriz não é refletido por esse método. O código do usuário deve usar os métodos da classe Array para manipular matrizes.
public Field[] getDeclaredFields() throws SecurityException
Retorna uma matriz de objetos Field refletindo todos os campos declarados pela classe ou interface representada por este objeto Class. Isso inclui campos públicos, protegidos, padrão (pacote) e privados , mas exclui os campos herdados . Os elementos na matriz retornados não são classificados e não estão em nenhuma ordem específica. Esse método retorna uma matriz de comprimento 0 se a classe ou a interface não declarar nenhum campo ou se esse objeto Class representar um tipo primitivo, uma classe de matriz ou nulo.
E se eu precisar de todos os campos de todas as classes pai? É necessário algum código, por exemplo, de https://stackoverflow.com/a/35103361/755804 :
fonte
Nos tutoriais do Java Reflection :
fonte