Este artículo describe el uso del mecanismo de reflexión de programación Java. Compártelo para su referencia, como sigue:
Prefacio: Reflexión: Obtenga dinámicamente la clase (archivo Bytecode como Person.Class en este artículo) y ejecute sus miembros. La reflexión puede encontrarse un poco menos en el desarrollo de la capa de aplicación de Android, pero para aquellos que desean superar la capa subyacente, deben ser competentes para usarla.
Clase de entidad
Persona.java
paquete com.sunwenou.reflect; // Nombre del paquete Persona de clase pública {Nombre de cadena privada; edad privada int; Public Person () {// sin parámetro} persona pública (nombre de cadena, int age) {// con parámetro super (); this.name = name; this.age = edad; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } public int getAge () {return Age; } public void setAge (int Age) {this.age = edad; } @Override public string toString () {return Name+","+edad; } public void show () {// Parámetro vacío System.out.println ("show"); } public void Fun (String ss) {// con parámetro System.out.println (SS); } function public static void () {// static system.out.println ("static"); }}Métodos para obtener dinámicamente archivos bytecode
Para hacer que la publicación del blog se vea conciso, se lanza una excepción y se omite la importación, lo mismo a continuación.
package com.sunwenou.reflect;public class Demo1 { /** * Method for dynamically obtaining bytecode files* 1: Use the Class getClass() method provided by the Object class* This method requires objects* 2: Each data type has a static class attribute, and the data type returned by this attribute belongs to the bytecode file object* int.class Person.class * 3: Use the forName() method provided by Class* Only Se necesita una cadena, que consiste en el nombre del paquete + nombre de clase*/public static void main (string [] args) lanza la excepción {// getClaz (); // getCalz2 (); getClaz3 (); } // Use el método FORNAME () proporcionado por la clase public static void getClaz3 () lanza la excepción {class <?> Claz = class.forname ("com.sunwenou.reflect.person"); Clase <?> Claz2 = class.forname ("com.sunwenou.reflect.person"); System.out.println (Claz == Claz2); } // Cada tipo de datos tiene un atributo de clase estática public static void getCalz2 () {class <Oll> p1 = persona.class; Clase <Oll> P2 = Person.class; System.out.println (P1 == P2); } // Use el método de clase getClass () proporcionado por la clase de objeto public static void getClaz () {persona persona1 = nueva persona (); Clase <? extiende persona> Claz = Person1.getClass (); // Person.Class Person Person2 = New Person (); Clase <? extiende persona> Claz2 = Person2.getClass (); // Person.class System.out.println (Claz == Claz2); }}Obtener dinámicamente la clase y crear el objeto
paquete com.sunwenou.reflect; public class Demo2 {public static void main (string [] args) lanza la excepción {// createObj (); createObJ2 (); } public static void createObj2 () lanza la excepción {// persona persona = nueva persona ("lisi", 23); // Obtenga la clase de objeto de archivo Bytecode <?> Claz = class.forname ("com.sunwenou.reflect.person"); //Person.class // Obtener el objeto de tipo constructor al que pertenece el método del constructor con parámetros. Constructor constructor = Claz.getConstrucor (String.Class, int.class); // Cree el objeto utilizando el método para crear un objeto proporcionado por la clase de constructor persona persona = (persona) constructor.newinstance ("lisi", 23); System.out.println (persona); } public static void createObj () lanza la excepción {// persona persona = nueva persona (); // Obtenga la clase de objeto de archivo Bytecode <?> Claz = class.forname ("com.sunwenou.reflect.person"); Object obj = Claz.NewinStance (); // Por defecto, use el constructor de parámetros vacíos para crear el objeto System.out.println (obj); }}Obtener dinámicamente la clase y asignar valores a las variables de miembro
paquete com.sunwenou.reflect; public class demo3 {public static void main (string [] args) lanza la excepción {// persona p = nueva persona (); //p.name = "lisi"; // Obtenga la clase de objeto de archivo Bytecode <?> Claz = class.forname ("com.sunwenou.reflect.person"); // Obtener el objeto de tipo de campo al que pertenece la variable de miembro // campo campo = Claz.getfield ("nombre"); // Obtenga el miembro con campo de permiso público = Claz.getDeclaredfield ("Nombre"); // Obtenga todos los campos declarados System.out.println (Field); // Las variables de miembros no estatales dependen del objeto OBJ = Claz.NewinStance (); campo.setAccessible (verdadero); // Cracking de fuerza bruta, establecido en campo accesible. System.out.println (obj); }}Obtener dinámicamente la clase y ejecutar el método
paquete com.sunwenou.reflect; public class Demo4 {public static void main (string [] args) lanza la excepción {// método1 (); método2 (); método3 (); } public static void Method3 () lanza la excepción {// Obtener la clase de objeto de archivo Bytecode <?> Claz = class.forname ("com.sunwenou.reflect.person"); Método m = Claz.getMethod ("función", nulo); M.Invoke (NULL, NULL); } //// Ejecutar el método con parámetros public static void método2 () lanza la excepción {// Obtener la clase de objeto de archivo Bytecode <?> Claz = class.forname ("com.sunwenou.reflect.person"); Método m = Claz.getMethod ("diversión", string.class); Object obj = Claz.newinStance (); M.invoke (obj, "hola"); } // Ejecutar el método sin parámetros public static void Method1 () lanza la excepción {// persona persona = nueva persona (); persona.show (); // Obtenga la clase de objeto de archivo Bytecode <?> Claz = class.forname ("com.sunwenou.reflect.person"); // Obtenga el objeto de archivo Bytecode al que pertenece el método ejecutado. Método m = Claz.getMethod ("show", nulo); // Los métodos no estáticos dependen del objeto OBJ = Claz.NewinStance (); // ejecutar método m.invoke (obj, null); }}Este es el uso básico de la reflexión. Podemos crear objetos a través del archivo Bytecode del objeto cuando no podemos crear objetos normalmente y ejecutarlos. ¿Has aprendido a hacerlo? ?
Para obtener más información sobre el contenido relacionado con Java, consulte los temas de este sitio: "Introducción y tutorial avanzado sobre la programación orientada a objetos de Java", "Tutorial sobre estructura de datos de Java y algoritmo", "Resumen de habilidades de nodo DOM de operación Java", "Resumen del archivo de Java y las habilidades de operación de directorio" y "Summary of Java Cache Skills"
Espero que este artículo sea útil para la programación Java de todos.