El mecanismo de reflexión Java está en el estado de ejecución. Un método de objeto se llama mecanismo de reflexión del lenguaje Java. Smith propuso por primera vez el concepto de reflexión en 1982, principalmente refiriéndose a una capacidad a la que un programa puede acceder, detectar y modificar su propio estado o comportamiento. La propuesta de este concepto desencadenó rápidamente la investigación sobre la reflectividad aplicada en el campo de la informática. Primero se adoptó en el campo del diseño del lenguaje de programación y logró logros en LISP y orientados a objetos. Por supuesto, la reflexión en sí no es un concepto nuevo.
El mecanismo de reflexión Java proporciona principalmente los siguientes usos:
Determine la clase a la que cualquier objeto pertenece en tiempo de ejecución
Construir objetos de cualquier clase en tiempo de ejecución
Determine las variables y métodos de los miembros de cualquier clase en tiempo de ejecución
Métodos de llamadas de cualquier objeto en tiempo de ejecución
Primero, echemos un vistazo a un ejemplo simple y usemos este ejemplo para comprender cómo funciona el mecanismo de reflexión de Java.
paquete com.wanggc.reflection; import java.lang.reflect.method;/*** Java Reflection Ejercicios. * * @author wanggc * /public class Formetest { /** * Función de entrada. * * @param args * parámetros * @throws Exception * Mensaje de error */ public static void main (string [] args) lanza excepción {// get class class <?> cls = class.fornam e (args [0]); / / Obtenga el objeto correspondiente a través del método de clase [] Métodos = Cls.getMethods ();Cuando el parámetro aprobado es java.lang.string, se emitirá el siguiente resultado
público booleano java.lang.string.equals (java.lang.object) público java.lang.string java.lang.string.ToString () public int java.lang.string.hashcode () pu blic int java.lang.string . int) public int java.lang.string.indexof (java.lang.string) public int java.lang.string.indexof (java.lang.string, int) público estático java.lang.string java.lang .string.valueof (int) público estática java.lang.string java.lang.string.valueof (char) pública estática java.lang.string java.lang.string java.lang.string.valueof (boolean) público estático java.lang.st anillo java.lang.string.valueof (float) Pública estática java.lang.string java.lang.string.valueof (char [], int, int) pública estática java.lang.string java.lang.string.valueof (doble) Público s tatic java.lang.string java .lang.string.valueof (char []) público estático público.lang.string java.lang.string.valueof (java.lang.object) público estático java.lang.string java. Lang.String. Str ing.codePointCount (int, int) public int java.lang.string.comparetoignorecase (java.lang.string) público java.lang.string java.lang.string.concat (java.lang.string) público boolean java.lang .String .Contains (Java.lang.CharSequence) público booleano java.lang.string.conteStequals (java.lang.charSequence) público booleano java.lang.string.conteStequals (java.lang.stringbuffer) estadística pública c java.lang. String java.lang.string.copyvalueof (char []) Public static java.lang.string java.lang.string.copyvalueof (char [], int, int) público booleano java.lang.string.endswith (java.lang. Cadena) público booleano java.lang.string.equalsignorecase (java.lang.string) público estático java.lang.string java.lang.string.format (java.lang.string, java.lang.object []) Public estático java .lang.string java.lang.st ring.format (java.util.locale, java.lang.string, java.lang.object []) byte público [] java.lang.string.getbytes (java.lang.string ) tira java.io.unsupportedenc oddExceptionPublic void java.lang. getBytes (java.nio.charset.char set) public void java .lang.string.getchars (int, int, char [], int) público nativo java.lang.string java.lang.string.intern () público booleano java .lang.string.isEmpty () public int j ava.lang. ) public int java.lan g.string.lastindexof (java.lang. String, int) public int java.lang.string.length () public boolean java.lang.string.matches (java.lang.streing) público int java .lang.string.offsetbycodepoin ts (int, int) público boolean java.lang .string.regionMatches (boolean, int, java.lang.string, int, int, int) público boolean java.lang.string.regionMatches (int,, java.lang.string, int, int) público java.lan g.string java.lang .string.replace (java.lang.charSequence, java.lang.charSequence) público java.lang.string java.lang.string.replace (char, char) público java.lang.string java .lang.string.replaceall (java .lang.string, java.lang.string) público java.lang.string java.lang.string.replaceSt (java.lang.string , java.lang.string) público java.lang.string [] java.lan g.string .split (java.lang.string) público java.lang.string [] java.lang.string.split (java.lang. Cadena, int) public boolean java.lang.string.startswith (java.lang.st ring) público booleano java.lang.string.startswith (java.lang.string, int) público java.lang.charSequence.lang.string .SubSequence (int, int) Public java.lang.string j ava.lang.string.substring (int) público java.lang.string java.lang.string.substring (int, int) public char [] java.lang. String.ToCharArray () public java.lang.string java.lang.string.tolow ercase () java. .String java.lang.string.touppercase () public java.lang.string java.lang.string ing.ToUpperperCase (java.util. Locale) público java.lang.string java.lang.string.trim () público público público público void java.lang.object.wait (long) lanza java.lang.interruptedExceptionPub lIC final void java.lang.object.wait () lanza java .lang.interruptedExceptionPublic Public Final void java.lang.object.wait (long, int) lanza java.lang.interruptedExceptionPublic Native Java.lang.cla ss java.lang.object.getClass () público final void nativo java.lang.object.
Esto enumera todos los nombres de métodos, sus caracteres limitantes, tipos de retorno y excepciones lanzadas de la clase java.lang.string. Este programa utiliza el método FORNAME de clase de clase para cargar la clase especificada y luego llama al método GetMethods para devolver la lista de métodos de la clase especificada. java.lang.reflect.method se usa para expresar un solo método en una determinada clase.
El uso del mecanismo de reflexión de Java generalmente requiere tres pasos:
Obtenga el objeto de clase que desea operar la clase a través del objeto de clase obtenido en el primer paso para obtener el método de la clase o el método o atributo obtenido en el segundo paso del funcionamiento del nombre de clase.
Cuando Java se está ejecutando, sin importar cuántos objetos genera una determinada clase, corresponderán al mismo objeto de clase, que representa la clase y la interfaz en el programa en ejecución. Hay tres formas comunes de obtener objetos de clase de la clase de operación:
Llame al nombre de método estático de la clase, como se muestra en el ejemplo anterior;
Use la sintaxis .class de la clase, como: class <?> Cls = string.class;
Llame al método GetClass del objeto, como: String Str = "ABC";
El siguiente usará un ejemplo para describir cómo ejecutar un cierto método de un objeto a través de los tres pasos mencionados anteriormente:
paquete com.wanggc.reflection; * * @author wanggc */ public class ReflectionTest {public static void main (string [] args) lanza excepción {displaysplay = new Display (); Obtenga el método de exposición del método de clase a través del método de clase = cl.getMethod ("show", string.class); void show (nombre de cadena) {System.out.println ("Hola:" + nombre);Como se mencionó anteriormente, cada clase de un programa Java tendrá un objeto de clase correspondiente a él. El primer paso en la reflexión de Java es obtener este objeto de clase, como 14 líneas de código. Por supuesto, el método de cada clase también debe tener un objeto de método correspondiente a él. Para llamar a este método a través de la reflexión, primero debe obtener el objeto del método de este método, como la línea 16 del código, y luego usar el objeto del método para llamar a este método a su vez, como la línea 18 del código. Tenga en cuenta que el primer parámetro del método GetMethod en la línea 16 es el nombre del método, y el segundo es el tipo de parámetro de este método, luego agregue los parámetros, porque GetMethod es un método de parámetro variádico. Ejecutar el método de invocación de 18 líneas de código, que en realidad es el método de espectáculo. El parámetro es pasarlo al método Show. El tipo y el número deben ser consistentes con el método GetMethod de 16 líneas.
El ejemplo anterior muestra cómo llamar a un método de cierta clase a través de la reflexión.
paquete com.wanggc.reflection; * * @author wanggc */ public class ReflectionTest {public static void main (string [] args) arroja excepción {// crea alumno de objeto estudiantil = nuevo estudiante (); ; ) + ":" + DestStudent.getStuage ()); * * @param desde * Copiar el objeto de origen * @param Dest * Copiar el objeto de destino * @throws Exception * Exception */ private static void copybean (objeto desde, objeto des) lanza excepción {// Obtener el objeto de clase de la copia CLASE DE OBJETIVO DE FUENTE <?> fromClass = from.getClass (); > DestClass = Dest.getClass (); Nombre del objeto de copia destinatario = Destc lass.getDeclaredfield (nombre); Objeto al atributo correspondiente del objeto de Copia de destino Destfield.set (Dest, Fromfield .:::::::::::::::::::::::::::::: :: :::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::lete ¡Get (de)) ; * / Clase Student { / ** Nombre* / String privado STUNAME; ** @Return Nombre del estudiante*/ public String getStuname () {return Stuname; } / *** Get Student Age** @return Student Age* / public int getStuage () {return stuage; ) {this.stuage = stuage;En el mecanismo de lanzamiento de Java, la clase corresponde a la clase, los métodos de clase corresponden al método y, por supuesto, las propiedades también corresponden al campo. Los comentarios en el código se han comentado en detalle y no se repetirán aquí. Pero tenga en cuenta que el campo proporciona métodos get y establecidos para obtener y establecer los valores de los atributos, pero dado que el atributo es un tipo privado, la accesibilidad del atributo debe establecerse en True, como las líneas 50 ~ 51 de la código. También puede establecer la accesibilidad para los campos completos y usar el método estático de accesible setAccessible en 40 líneas, como: accesibleBject.SetAccessible (fromfields, true);
La descripción anterior muestra cómo usar el mecanismo de reflexión Java para operar los métodos y propiedades de una clase.
paquete com.wanggc.reflection; * * @author wanggc */ public class ReflectionTest {public static void main (string [] args) arroja excepción {// crea alumno de objeto estudiantil = nuevo estudiante (); ; ()); * * @param desde * Copiar el objeto de origen * @param Dest * Copiar el objeto de destino * @throws Exception * Exception */ private static Object CopyBean (objeto desde) lanza Exception {// Obtener el objeto de clase Copiar de la clase de objeto de origen < ?> fromclass = from.getClass (); (); set (ints, fromfield.get (from)); * / Clase Student { / ** Nombre* / String privado STUNAME; ** @Return Nombre del estudiante*/ public String getStuname () {return Stuname; } / *** Get Student Age** @return Student Age* / public int getStuage () {return stuage; ) {this.stuage = stuage;El resultado de este ejemplo y el ejemplo anterior es el mismo. Sin embargo, el objeto devuelto por el método CopyBean ya no se pasa en el exterior, sino que se genera internamente por el método, como se muestra en el código en la línea 40. Nota: El método de NewInstance de la clase solo puede crear clases que contengan constructores sin parámetros. wanggc ");
En este punto, se han introducido las funciones comunes del mecanismo de reflexión de Java (el método de llamar a los objetos en tiempo de ejecución, el uso de atributos de clase y la creación de objetos de clase).
Suplemento: al obtener los métodos, propiedades y constructores de la clase, hay dos métodos correspondientes: getxxx y getgetDeclaredxxx. La diferencia es que el primero devuelve los métodos y propiedades con los derechos de acceso público, incluidos los de la clase principal;
El contenido anterior es el mecanismo de lanzamiento de Java que te presentó, espero que te guste.