Breaking

Post Top Ad

Your Ad Spot

jueves, 19 de diciembre de 2019

Reflexión Java

En este tutorial, aprenderemos la reflexión, una característica de la programación Java que nos permite inspeccionar y modificar clases, métodos, etc.
En Java, la reflexión nos permite inspeccionar y manipular clases, interfaces, constructores, métodos y campos en tiempo de ejecución.

Clase de Java llamada Clase

Antes de aprender sobre la reflexión en Java, necesitamos saber sobre la clase de Java llamada Class.
Hay una clase en Java llamada Classque mantiene toda la información sobre objetos y clases en tiempo de ejecución.
El objeto de Classdescribe las propiedades de una clase particular. Este objeto se usa para realizar la reflexión.

Crear objetos de la clase llamada Clase

Podemos crear objetos de Classpor
  • utilizando el método forName ()
forName()toma un argumento de cadena (nombre de una clase) y devuelve un objeto de ClassEl objeto devuelto se refiere a la clase especificada por la cadena. Por ejemplo,
  1. Class Dog { }
  2. Class c1 = Class.forName("Dog");
  • utilizando el método getClass ()
El getClass()método usa el objeto de una clase particular para crear un nuevo objeto de ClassPor ejemplo,
  1. Dog d1 = new Dog()
  2. Class c1 = d1.getClass();
  • usando .class
También podemos crear objetos Classutilizando la extensión .class . Por ejemplo,
  1. Class c1 = Dog.class;
Una vez que Classse crean los objetos de , podemos usar estos objetos para realizar la reflexión.

Obtener interfaces

Podemos utilizar el getInterfaces()método de Classrecopilar información sobre las interfaces implementadas por la clase. Este método devuelve una matriz de interfaces.

Ejemplo: obtener interfaces

  1. import java.lang.Class;
  2. import java.lang.reflect.*;
  3. interface Animal {
  4. public void display();
  5. }
  6. interface Mammal {
  7. public void makeSound();
  8. }
  9. class Dog implements Animal, Mammal {
  10. public void display() {
  11. System.out.println("I am a dog.");
  12. }
  13. public void makeSound() {
  14. System.out.println("Bark bark");
  15. }
  16. }
  17. class ReflectionDemo {
  18. public static void main(String[] args) {
  19. try {
  20. // create an object of Dog class
  21. Dog d1 = new Dog();
  22. // create an object of Class using getClass()
  23. Class obj = d1.getClass();
  24. // find the interfaces implemented by Dog
  25. Class[] objInterface = obj.getInterfaces();
  26. for(Class c : objInterface) {
  27. // print the name of interfaces
  28. System.out.println("Interface Name: " + c.getName());
  29. }
  30. }
  31. catch(Exception e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. }
Salida
Nombre de interfaz: Animal
Nombre de interfaz: Mammal

Obtenga Superclase y Modificador de Acceso

El método getSuperclass()de la clase Classse puede utilizar para obtener información sobre la superclase de una clase en particular.
Y también, Classproporciona un método getModifier()que devuelve el modificador de clase en forma entera.

Ejemplo: Obtener Superclase y Modificador de Acceso

  1. import java.lang.Class;
  2. import java.lang.reflect.*;
  3. interface Animal {
  4. public void display();
  5. }
  6. public class Dog implements Animal {
  7. public void display() {
  8. System.out.println("I am a dog.");
  9. }
  10. }
  11. class ReflectionDemo {
  12. public static void main(String[] args) {
  13. try {
  14. // create an object of Dog class
  15. Dog d1 = new Dog();
  16. // create an object of Class using getClass()
  17. Class obj = d1.getClass();
  18. // Get the access modifier of Dog in integer form
  19. int modifier = obj.getModifiers();
  20. System.out.println("Modifier: " + Modifier.toString(modifier));
  21. // Find the superclass of Dog
  22. Class superClass = obj.getSuperclass();
  23. System.out.println("Superclass: " + superClass.getName());
  24. }
  25. catch(Exception e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. }
Salida
Modificador: público
Superclase: Animal
Para conocer más métodos Class, visite java.lang.Class .

Campos reflectores, métodos y constructores

El paquete java.lang.reflectproporciona clases que pueden usarse para manipular miembros de clase. Por ejemplo,
  • Clase de método : proporciona información sobre los métodos de una clase.
  • Clase de campo : proporciona información sobre los campos de una clase.
  • Clase de constructor : proporciona información sobre los constructores de una clase.

Reflejo de un campo

Podemos inspeccionar y modificar diferentes campos de una clase usando varios métodos proporcionados por la Fieldclase.
  • getFields (): devuelve todos los campos públicos de la clase y su superclase
  • getDeclaredFields () : devuelve todos los campos de la clase
  • getModifier () - devuelve el modificador de campos en forma entera
  • set (classObject, value) : establece el valor de un campo con el valor especificado
  • get (classObject) : obtiene el valor de un campo
  • setAccessible (boolean) : hace que el campo privado sea accesible
Nota: Si conocemos el nombre de un campo, podemos usar
  • getField ("fieldName") : devuelve el campo público que tiene el nombre fieldName de la clase.
  • getDeclaredField ("fieldName") : devuelve el campo que tiene el nombre fieldName de la clase.
Para conocer más métodos de la Fieldvisita de clase, Clase de campo .

Ejemplo: acceso al campo público

  1. import java.lang.Class;
  2. import java.lang.reflect.*;
  3. class Dog {
  4. public String type;
  5. }
  6. class ReflectionDemo {
  7. public static void main(String[] args) {
  8. try{
  9. Dog d1 = new Dog();
  10. // create an object of the class Class
  11. Class obj = d1.getClass();
  12. // manipulating the public field type of Dog
  13. Field field1 = obj.getField("type");
  14. // set the value of field
  15. field1.set(d1, "labrador");
  16. // get the value of field by converting in String
  17. String typeValue = (String)field1.get(d1);
  18. System.out.println("type: " + typeValue);
  19. // get the access modifier of type
  20. int mod1 = field1.getModifiers();
  21. String modifier1 = Modifier.toString(mod1);
  22. System.out.println("Modifier: " + modifier1);
  23. System.out.println(" ");
  24. }
  25. catch(Exception e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. }
Salida
tipo: labrador
Modificador: público

Ejemplo: acceso al campo privado

  1. import java.lang.Class;
  2. import java.lang.reflect.*;
  3. class Dog {
  4. private String color;
  5. }
  6. class ReflectionDemo {
  7. public static void main(String[] args) {
  8. try {
  9. Dog d1 = new Dog();
  10. // create an object of the class Class
  11. Class obj = d1.getClass();
  12. // accessing the private field
  13. Field field2 = obj.getDeclaredField("color");
  14. // making the private field accessible
  15. field2.setAccessible(true);
  16. // set the value of color
  17. field2.set(d1, "brown");
  18. // get the value of type converting in String
  19. String colorValue = (String)field2.get(d1);
  20. System.out.println("color: " + colorValue);
  21. // get the access modifier of color
  22. int mod2 = field2.getModifiers();
  23. String modifier2 = Modifier.toString(mod2);
  24. System.out.println("modifier: " + modifier2);
  25. }
  26. catch(Exception e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. }
Salida
color marrón
modificador: privado

Reflexión de los métodos de Java

Al igual que los campos, podemos inspeccionar diferentes métodos de una clase utilizando varios métodos proporcionados por la Methodclase.
  • getMethods () : devuelve todos los métodos públicos de la clase y su superclase
  • getDeclaredMethod () - devuelve todos los métodos de la clase
  • getName () : devuelve el nombre de los métodos
  • getModifiers () : devuelve el modificador de acceso de los métodos en forma entera
  • getReturnType () : devuelve el tipo de método de retorno
Para conocer más métodos de la Methodvisita de clase, Clase de método .

Ejemplo: método de reflexión

  1. import java.lang.Class;
  2. import java.lang.reflect.*;
  3. class Dog {
  4. public void display() {
  5. System.out.println("I am a dog.");
  6. }
  7. protected void eat() {
  8. System.out.println("I eat dog food.");
  9. }
  10. private void makeSound() {
  11. System.out.println("Bark Bark");
  12. }
  13. }
  14. class ReflectionDemo {
  15. public static void main(String[] args) {
  16. try {
  17. Dog d1 = new Dog();
  18. // create an object of Class
  19. Class obj = d1.getClass();
  20. // get all the methods using the getDeclaredMethod()
  21. Method[] methods = obj.getDeclaredMethods();
  22. // get the name of methods
  23. for(Method m : methods) {
  24. System.out.println("Method Name: " + m.getName());
  25. // get the access modifier of methods
  26. int modifier = m.getModifiers();
  27. System.out.println("Modifier: " + Modifier.toString(modifier));
  28. // get the return types of method
  29. System.out.println("Return Types: " + m.getReturnType());
  30. System.out.println(" ");
  31. }
  32. }
  33. catch(Exception e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. }
Salida
Nombre del método: display
Modificador: público
Tipo de retorno: vacío

Nombre del método: comer
Modificador: protegido
Tipo de retorno: vacío

Nombre del método: makeSound
Modificador: privado
Tipo de retorno: vacío

Reflexión del constructor

También podemos inspeccionar diferentes constructores de una clase usando varios métodos proporcionados por la Constructorclase.
  • getConstructors () : devuelve todos los constructores públicos de una clase y superclase de la clase
  • getDeclaredConstructor () - devuelve todos los constructores
  • getName () : devuelve el nombre de los constructores
  • getModifiers () - devuelve el modificador de acceso de constructores en forma entera
  • getParameterCount () - devuelve el número de parámetros de constructores
Para conocer más métodos de la Constructorclase, visite la clase Constructor.

Ejemplo: reflexión del constructor

  1. import java.lang.Class;
  2. import java.lang.reflect.*;
  3. class Dog {
  4. public Dog() {
  5. }
  6. public Dog(int age) {
  7. }
  8. private Dog(String sound, String type) {
  9. }
  10. }
  11. class ReflectionDemo {
  12. public static void main(String[] args) {
  13. try {
  14. Dog d1 = new Dog();
  15. Class obj = d1.getClass();
  16. // get all the constructors in a class using getDeclaredConstructor()
  17. Constructor[] constructors = obj.getDeclaredConstructors();
  18. for(Constructor c : constructors) {
  19. // get names of constructors
  20. System.out.println("Constructor Name: " + c.getName());
  21. // get access modifier of constructors
  22. int modifier = c.getModifiers();
  23. System.out.println("Modifier: " + Modifier.toString(modifier));
  24. // get the number of parameters in constructors
  25. System.out.println("Parameters: " + c.getParameterCount());
  26. }
  27. }
  28. catch(Exception e) {
  29. e.printStackTrace();
  30. }
  31. }
  32. }
Salida
Nombre del constructor: Perro
Modificador: público
Parámetros: 0

Nombre del constructor: Perro
Modificador: público
Parámetros: 1

Nombre del constructor: Perro
Modificador: privado
Parámetros: 2

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas