Primeiro, vamos conhecer algumas categorias.
Classe (java.lang.class)
Um objeto de classe é um objeto especial e cada classe tem um objeto de classe para criar um objeto "regular" dessa classe. Pode ser obtido através do método getClass () do objeto.
Por exemplo, executamos esta linha de código:
A cópia do código é a seguinte:
System.out.println ("test" .getclass (). Tostring ());
O resultado é:
A cópia do código é a seguinte:
classe java.lang.string
Campo (java.lang.reflect.field)
Esta classe representa um campo, que pode ser usado para acessar a classe
Em seguida, vamos criar a classe de teste:
A cópia do código é a seguinte:
Classe Book {
título público de string;
public int comprimento = 0;
public ArrayList <Page> páginas = null;
@Override
public string tostring () {
String sb = "livro:/n";
sb+= "title ="+title+"/n";
sb + = "comprimento =" + comprimento + "/n";
sb + = "páginas =" + páginas + "/n";
if (páginas! = nulo) {
para (página da página: páginas) {
sb += página.toString ();
}
}
return sb.toString ();
}
}
Página da classe {
@Override
public string tostring () {
retornar "página/n";
}
}
Ligue para o seguinte método para testar a classe acima:
A cópia do código é a seguinte:
Livro do livro = novo livro ();
System.out.println (livro);
Seu resultado é o seguinte:
A cópia do código é a seguinte:
Livro:
título = nulo
comprimento = 0
páginas = nulo
Este é o estado inicial do objeto do livro
Usamos o mecanismo de reflexão para obter o campo de comprimento no objeto do livro e modificá -lo para visualizar os resultados:
A cópia do código é a seguinte:
Livro do livro = novo livro ();
Classe <?> Aclass = book.getclass ();
Campo de campo = aclass.getfield ("comprimento");
field.setInt (livro, 9);
System.out.println (livro);
Você pode ver que os resultados em execução são:
A cópia do código é a seguinte:
Livro:
título = nulo
comprimento = 9
páginas = nulo
Pode -se observar que o valor do campo de comprimento foi modificado.
O Modificado acima é um campo simples do tipo int.
A cópia do código é a seguinte:
Livro do livro = novo livro ();
Classe <?> Aclass = book.getclass ();
Campo [] campos = aclass.getfields ();
para (campo de campo: campos) {
field.setAccessible (true);
if (field.gettype (). igual (string.class)) {
field.set (Book, "Grimm's Fairy Tale");
} else if (field.gettype (). igual (int.class)) {
Field.Set (Book, 199);
}
}
System.out.println (livro);
O resultado da saída do código acima é:
A cópia do código é a seguinte:
Livro:
Título = Conto de fadas de Grimm
comprimento = 199
páginas = nulo
De fato, todos os campos do tipo String são modificados para "Tale de Fadas de Grimm" e todos os campos do tipo int são modificados para 199. Nem sabemos o que esse campo significa.
Em seguida, modificamos o campo Páginas. Este campo é um Arraylist.
A cópia do código é a seguinte:
Livro do livro = novo livro ();
Classe <?> Aclass = book.getclass ();
Campo [] campos = aclass.getfields ();
para (campo de campo: campos) {
field.setAccessible (true);
if (field.gettype (). igual (ArrayList.class)) {
String genric = field.getGenerictype (). Tostring ();
String genricClass = genric.substring (
genric.indexOf ('<') + 1,
genric.indexOf ('>'));
Classe <?> Entityclass = classe.formaName (GenricClass);
Objeto obj = entityclass.newInstance ();
ArrayList List = new ArrayList ();
list.add (obj);
field.set (livro, lista);
}
}
System.out.println (livro);
O resultado da saída é o seguinte:
A cópia do código é a seguinte:
Livro:
título = nulo
comprimento = 0
páginas = [página
]
Página
Pode -se observar que, embora não tenhamos usado diretamente a classe da página, ainda criamos um objeto de página.
A declaração de criação do objeto da página está na frase: entityclass.newinstance (). A instrução NewInstance é um método importante de objeto de classe e é usado para criar o objeto correspondente desta classe. Obviamente, o construtor de classe suporta. Além disso, através do método GenGenerictype, podemos obter o modificador de tipo do campo. Coloque aqui, o que você recebe é ArrayList <Page>. Com esta string, podemos carregar a classe da página e criar um objeto de página através da classe Loader Class.ForName.