Muchos marcos convencionales utilizan tecnología de reflexión. Por ejemplo, el marco ssh utiliza dos tecnologías: xml como archivo de configuración + tecnología de reflexión.
Paquetes de clases relacionados con la reflexión.
java.lang.reflect.* y java.lang.Class;
Todos los tipos en Java (incluidos los tipos básicos) corresponden a un objeto Clase, y esta Clase es java.lang.Class. Es decir, cada tipo tiene un objeto de Clase correspondiente en la Clase y no tiene un constructor público. Tenga en cuenta que no es que no haya acceso público.
Cómo obtener un objeto de clase
Copie el código de código de la siguiente manera:
.Para cada object.getCalss(), puede obtener la Clase correspondiente.
.Class.forName (String), el método de escritura de String: nombre del paquete.nombre de la clase.Se creará el objeto correspondiente al nombre del paquete.nombre de la clase Nota: 1.2 solo se aplica a los tipos de referencia.
.Para tipos básicos: la clase de encapsulación representa el objeto Clase del tipo básico correspondiente. TIPO corresponde al objeto Clase de int.
.Tipo, Clase. <El tipo 4 es universal.>
De los cuatro métodos anteriores, solo el método 2 es dinámico. Simplemente cambie un paquete. Tiene potencial dinámico. Por lo tanto, si realmente desea incorporar la programación dinámica, solo puede usar el método 2.
Solo hay un objeto Clase de cada tipo, es decir, solo tienen una dirección, pero los diferentes tipos son diferentes.
Entonces, los siguientes resultados de impresión son todos verdaderos.
Copie el código de código de la siguiente manera:
//Tipos de pares y referencias
Clase c1 = "".getClass();
Clase c2 = Class.forName("java.lang.String");
Clase c3 = Cadena.clase;
System.out.println(c1 ==c2);//verdadero
//Para tipos básicos
Clase num1 = Entero.TIPO;
Clase num2 = int.clase;
System.out.println(num1 == num2);//verdadero
Reflexión para obtener métodos relacionados de miembros de una clase
[Obtener estructura <según tipo de parámetro>] (generalmente usado sin declarado)
Copie el código de código de la siguiente manera:
Constructor<T> getConstructor(Clase<?>... tipos de parámetros)
Devuelve un objeto Constructor que refleja el constructor público especificado de la clase representada por este objeto Clase.
Constructor<?>[] getConstructores()
Devuelve una matriz que contiene objetos Constructor que reflejan todos los constructores públicos de la clase representada por este objeto Clase.
Constructor<T> getDeclaredConstructor(Clase<?>... tipos de parámetros)
Devuelve un objeto Constructor que refleja el método constructor especificado para la clase o interfaz representada por este objeto Clase.
Constructor<?>[] getDeclaredConstructors()
Devuelve una matriz de objetos Constructor que reflejan todos los métodos constructores declarados por la clase representada por este objeto Clase.
[Obtener atributo <según el nombre del atributo>] (generalmente se usa con declarado, porque los atributos generalmente son privados)
Copie el código de código de la siguiente manera:
Campo getField (nombre de cadena)
Devuelve un objeto Field que refleja los campos miembros públicos especificados de la clase o interfaz representada por este objeto Class.
Campo[] obtenerCampos()
Devuelve una matriz que contiene objetos Field que reflejan todos los campos públicos accesibles de la clase o interfaz representada por este objeto Class.
Campo getDeclaredField (nombre de cadena)
Devuelve un objeto Field que refleja el campo declarado especificado de la clase o interfaz representada por este objeto Class.
Campo[] getDeclaredFields()
Devuelve una matriz de objetos Field que reflejan todos los campos declarados por la clase o interfaz representada por este objeto Class.
[Obtener método <nombre del método más tipo de parámetro>] (generalmente usado sin declarado)
Copie el código de código de la siguiente manera:
Método getMethod(nombre de cadena, clase<?>... tipos de parámetros)
Devuelve un objeto Método que refleja el método miembro público especificado de la clase o interfaz representada por este objeto Clase.
Método[] getMétodos()
Devuelve una matriz que contiene objetos Método que reflejan los miembros públicos de la clase o interfaz representada por este objeto Clase (incluidos los declarados por esa clase o interfaz y los heredados de superclases y superinterfaces).
Método getDeclaredMethod(Nombre de cadena, Clase<?>... tipos de parámetros)
Devuelve un objeto Método que refleja el método declarado especificado de la clase o interfaz representada por este objeto Clase.
Método[] getDeclaredMethods()
Devuelve una matriz de objetos Método que reflejan todos los métodos declarados por la clase o interfaz representada por este objeto Clase, incluidos los métodos públicos, protegidos, de acceso predeterminado (paquete) y privados, pero excluyendo los métodos heredados.
T nueva instancia()
Crea una nueva instancia de la clase representada por este objeto Clase. <nueva Instancia() puede crear objetos dinámicamente>
Cadena a Cadena()
Convertir objeto en cadena.
Aviso: newInstance() llama a un constructor sin parámetros. Si la clase no tiene un constructor sin parámetros, newInstance() generará una excepción.
Los métodos declarados admiten la privacidad, pero no la herencia. Los métodos no declarados admiten la herencia, pero no la privacidad y solo pueden eliminar cosas públicas.
Por lo tanto, las propiedades generalmente se declaran mediante declaración, porque las propiedades generalmente son privadas, los métodos generalmente se obtienen sin declaración y los constructores generalmente se obtienen sin declaración.
La reflexión de simulación de instancia obtiene propiedades y métodos relevantes en la clase
Usar la reflexión para asignar valores a propiedades
Métodos en el campo
Obtener objeto (Objeto obj)
Devuelve el valor del campo representado por este campo en el objeto especificado.
Campo f = c.getXXField(nombre de propiedad);
valor = f.get(objeto);
conjunto vacío (Objeto obj, Valor del objeto)
Establece el campo representado por este objeto Campo en la variable de objeto especificada al nuevo valor especificado.
f.set(objeto, valor);
Clase<?> getType()
Devuelve un objeto Clase que identifica el tipo declarado del campo representado por este objeto Campo.
Se utiliza para obtener el tipo de atributo (devuelve un objeto de clase).
Copie el código de código de la siguiente manera:
Clase c = Estudiante.clase;
Object obj = c.newInstance(); //Crea un objeto de clase Student
Field f = c.getDeclaredField("name"); //Obtener el atributo de nombre
f.setAccessible(true); //Establecer acceso privado.
f.set(obj, "zhangsan");
System.out.println(f.get(obj)); //Obtiene el valor del atributo de nombre del obj.
Usar la reflexión para llamar a construcciones La llamada real al constructor es cuando se llama al método newInstance().
Copie el código de código de la siguiente manera:
Clase c = Class.forName("com.clazz.reflect.Student");
Constructor con = c.getConstructor(); //No se realiza ninguna construcción.
Objeto cObj = c.getConstructor().newInstance();//Llamar al constructor sin parámetros
Constructor conAll = c.getConstructor(int.class,String.class,int.class);
Objeto caobj = conAll.newInstance(1001,"zjamgs",234235);// Llame al constructor con parámetros.
System.out.println(caobj); //Imprimir salida
Llamar a métodos usando la reflexión. Objeto.Nombre del método (valor 1,2,3);
Método m = c.getMethoed(nombre del método, tipo de parámetro...);
m.invoke (objeto, parámetros de llamada al método) Si el parámetro formal requerido por el método subyacente es 0, la longitud de la matriz de argumentos proporcionada puede ser 0 o nula.
Copie el código de código de la siguiente manera:
Clase c = Class.forName("com.clazz.reflect.Student");
Objeto obj = c.newInstance(); //Crea un objeto Sutdent.
Método msetName = c.getMethod("setName", String.class);//obj no necesita convertir el tipo
msetName.invoke(obj, "zhangsan");//Llame al método setName y pase parámetros.
Método msetId = c.getMethod("setId", int.class);
msetId.invoke(obj, 409090202);
System.out.println(obj);
Ejemplos de aplicación de reflexión clase de entidad
Copie el código de código de la siguiente manera:
paquete org.dennisit.reflect.entity;
importar java.io.Serializable;
/**
*
*Usuario.java
*
* @versión: 1.1
*
* @autor: Su Ruonian<a href="mailto:
[email protected]">Enviar correo electrónico</a>
*
* @since: 1.0 Hora de creación: 2013-2-26 01:43:56 pm
*
* TODO: la clase User.java se utiliza para...
*
*/
El usuario de clase pública implementa Serializable{
prueba de cadena privada;
ejecución pública vacía (nombre de cadena, edad int) {
System.out.println("nombre=" + nombre + ",edad=" + edad);
}
}
Clase de prueba de reflexión.
Copie el código de código de la siguiente manera:
paquete org.dennisit.reflect.main;
importar java.lang.reflect.Field;
/**
*
* ReflejarEx.java
*
* @versión: 1.1
*
* @autor: Su Ruonian<a href="mailto:
[email protected]">Enviar correo electrónico</a>
*
* @since: 1.0 Hora de creación: 2013-2-26 01:46:00 pm
*
* TODO: la clase ReflectEx.java se utiliza para...
*
*/
clase pública ReflectEx {
public static void main (String [] args) lanza una excepción {
Clase cls = Class.forName("org.dennisit.reflect.entity.User");
Objeto obj = cls.newInstance(); //Crear objeto de usuario
Field f = cls.getDeclaredField("test"); //Obtener el atributo de prueba
f.setAccessible(true); //Permisos de acceso abiertos para prueba de atributos privados
f.set(obj, "zhangsan"); //Copiar nuevamente para probar
System.out.println(f.get(obj)); //Obtiene el valor del atributo de prueba de obj.
//Obtener el método basado en el nombre del método ejecutar
java.lang.reflect.Method m = cls.getMethod("ejecutar", String.class, int.class);
m.invoke(obj, "dennisit",23); // Llamar al método de ejecución
}
}
Efecto de operación
Copie el código de código de la siguiente manera:
zhangsan
nombre=dennisit,edad=23
Ejemplo de escritura de una clase de instanciación dinámica reflexiva
Copie el código de código de la siguiente manera:
paquete org.dennisit.reflect.main;
importar java.lang.reflect.Field;
importar java.lang.reflect.Method;
importar java.util.Map;
importar java.util.Set;
/**
*
* DynamicReflect.java
*
* @versión: 1.1
*
* @autor: Su Ruonian<a href="mailto:
[email protected]">Enviar correo electrónico</a>
*
* @since: 1.0 Hora de creación: 2013-2-26 01:58:12 pm
*
* TODO: Ejemplo de instanciación dinámica usando reflexión
*
*/
clase pública DynamicReflect {
objeto estático público getInstance (nombre de clase de cadena, mapa <cadena, objeto>) lanza una excepción {
Clase c = Class.forName(className);
Objeto obj = c.newInstance(); //Objeto objeto
Set<String> llaves = map.keySet() //Obtener todos los atributos correspondientes
Field[] fAll = c.getDeclaredFields(); //Obtiene todas las propiedades de la clase
for(int i=0;i<fAll.length;i++){
for(String key:keys){ // Coincidencia de bucles
if(fAll[i].getName().equals(key)){ //Si el atributo pasado por el usuario coincide con el nombre del atributo en la clase obtenida
Campo f = c.getDeclaredField(key);//Obtener este atributo
//Construye el nombre del método setXxx()
Nombre del método de cadena = "conjunto" + key.substring(0,1).toUpperCase()+key.substring(1);
Método método = c.getMethod(methodName, f.getType());//Obtiene el método correspondiente según el nombre de usuario construido
método.invoke(obj, map.get(clave));//Llamada al método
}demás{
continuar;
}
}
}
objeto de retorno;
}
}
A continuación probamos el ejemplo de creación de instancias de reflexión dinámica que escribimos.
clase de entidad
Copie el código de código de la siguiente manera:
paquete org.dennisit.reflect.entity;
importar java.io.Serializable;
/**
*
*Usuario.java
*
* @versión: 1.1
*
* @autor: Su Ruonian<a href="mailto:
[email protected]">Enviar correo electrónico</a>
*
* @since: 1.0 Hora de creación: 2013-2-26 01:43:56 pm
*
* TODO: clase de entidad
*
*/
El usuario de clase pública implementa Serializable{
nombre de cadena privada;
edad privada;
correo electrónico de cadena privada;
public User() { //No debe tener un constructor de parámetros
}
// captador() y definidor()
}
clase de prueba principal
Copie el código de código de la siguiente manera:
paquete org.dennisit.reflect.main;
importar java.util.HashMap;
importar java.util.Map;
importar org.dennisit.reflect.entity.User;
/**
*
* ReflejarEx.java
*
* @versión: 1.1
*
* @autor: Su Ruonian<a href="mailto:
[email protected]">Enviar correo electrónico</a>
*
* @since: 1.0 Hora de creación: 2013-2-26 01:46:00 pm
*
* TODO: la clase ReflectEx.java se utiliza para...
*
*/
clase pública ReflectEx {
public static void main (String [] args) lanza una excepción {
Clase cls = Class.forName("org.dennisit.reflect.entity.User");
String className = "org.dennisit.reflect.entity.User";
Mapa<Cadena,Objeto> mapa = nuevo HashMap<Cadena, Objeto>();
map.put("nombre", "dennisit");
map.put("edad", 22);
map.put("correo electrónico", "[email protected]");
Usuario usuario = (Usuario)DynamicReflect.getInstance(nombre de clase, mapa);
System.out.println(user.getName() + "," + user.getAge() + "," + user.getEmail());
}
}
Resultados de ejecución del programa
Copie el código de código de la siguiente manera: