Primero, conozcamos algunas categorías.
Clase (java.lang.class)
Un objeto de clase es un objeto especial, y cada clase tiene un objeto de clase para crear un objeto "regular" de esa clase. Se puede obtener a través del método getClass () del objeto.
Por ejemplo, ejecutamos esta línea de código:
La copia del código es la siguiente:
System.out.println ("test" .getClass (). ToString ());
El resultado es:
La copia del código es la siguiente:
clase java.lang.string
Campo (java.lang.reflect.field)
Esta clase representa un campo, que se puede usar para acceder a la clase.
A continuación, creemos la clase de prueba:
La copia del código es la siguiente:
Libro de clase {
título de cadena pública;
public int longitud = 0;
Public ArrayList <page> páginas = nulo;
@Anular
public String toString () {
Cadena sb = "libro:/n";
sb+= "title ="+title+"/n";
sb + = "longitud =" + longitud + "/n";
sb + = "páginas =" + páginas + "/n";
if (páginas! = null) {
para (página de página: páginas) {
SB += Page.ToString ();
}
}
return sb.ToString ();
}
}
página de clase {
@Anular
public String toString () {
devolver "Página/n";
}
}
Llame al siguiente método para probar la clase anterior:
La copia del código es la siguiente:
Libro libro = nuevo libro ();
System.out.println (libro);
Su resultado es este:
La copia del código es la siguiente:
Libro:
Título = NULL
Longitud = 0
Páginas = NULL
Este es el estado inicial del objeto del libro
Utilizamos el mecanismo de reflexión para obtener el campo de longitud en el objeto del libro y modificarlo para ver los resultados:
La copia del código es la siguiente:
Libro libro = nuevo libro ();
Clase <?> Aclass = book.getClass ();
Campo campo = aclass.getfield ("longitud");
Field.SetInt (libro, 9);
System.out.println (libro);
Puede ver que los resultados de ejecución son:
La copia del código es la siguiente:
Libro:
Título = NULL
Longitud = 9
Páginas = NULL
Se puede ver que el valor del campo de longitud ha sido modificado.
El anterior modificado es un campo simple de INT.
La copia del código es la siguiente:
Libro libro = nuevo libro ();
Clase <?> Aclass = book.getClass ();
Campo [] campos = aclass.getfields ();
para (campo campo: campos) {
campo.setAccessible (verdadero);
if (field.gettype (). Equals (string.class)) {
Field.set (libro, "Grimm's Fairy Tale");
} else if (field.gettype (). Equals (int.class)) {
Field.set (Libro, 199);
}
}
System.out.println (libro);
El resultado de salida del código anterior es:
La copia del código es la siguiente:
Libro:
Título = Grimm's Fairy Tale
Longitud = 199
Páginas = NULL
De hecho, todos los campos de tipo de cadena se modifican a "Grimm's Fairy Tale" y todos los campos de Tipo int se modifican a 199. Ni siquiera sabemos lo que significa este campo.
A continuación, modificamos el campo de las páginas. Este campo es una lista de matrices.
La copia del código es la siguiente:
Libro libro = nuevo libro ();
Clase <?> Aclass = book.getClass ();
Campo [] campos = aclass.getfields ();
para (campo campo: campos) {
campo.setAccessible (verdadero);
if (field.gettype (). Equals (ArrayList.Class)) {
String genric = field.getGenerictype (). ToString ();
Cadena genricclass = genric.substring (
genric.indexof ('<') + 1,
genric.indexof ('>'));
Class <?> EntityClass = class.forname (GenricClass);
Object obj = entityclass.newinstance ();
ArrayList list = new ArrayList ();
list.add (obj);
campo.set (libro, lista);
}
}
System.out.println (libro);
El resultado de salida es el siguiente:
La copia del código es la siguiente:
Libro:
Título = NULL
Longitud = 0
Páginas = [Página
]
Página
Se puede ver que aunque no usamos la clase de página directamente, todavía creamos un objeto de página.
La declaración de creación del objeto de página está en la oración: entityclass.newinstance (). La declaración NewInstance es un método importante de objeto de clase y se utiliza para crear el objeto correspondiente de esta clase. Por supuesto, el constructor de clase lo admite. Además, a través del método GenGenericType, podemos obtener el modificador de tipo del campo. Póngalo aquí, lo que obtienes es ArrayList <page>. Con esta cadena, podemos cargar la clase de página y crear un objeto de página a través del cargador de clase Class.forname.