Breaking

Post Top Ad

Your Ad Spot

martes, 9 de julio de 2019

Métodos del objeto de Java: getClass ()

Introducción

Este artículo es una continuación de una serie de artículos que describen los métodos a menudo olvidados de la clase de objetos base del lenguaje Java. A continuación se muestran los métodos del objeto Java base presente en todos los objetos Java debido a la herencia implícita de Object junto con los enlaces a cada artículo de esta serie.
El enfoque de este artículo es el getClass()método, que se utiliza para acceder a los metadatos sobre la clase del objeto con el que está trabajando.

El método getClass ()

El método Object, que es algo confuso o mal entendido, getClass()devuelve una instancia de la clase Class, que contiene información sobre la clase desde la que getClass()se llamó. ¡Menos mal, si ya no estás confundido por esa última afirmación, porque lo soy y lo escribí!
Permítame tratar de desentrañar esa oración con una demostración de cómo podría usarse esto. A continuación encontrará la Personclase que utilicé en el artículo inicial sobre el toString()método de la clase Object .
package com.adammcquistan.object;

import java.time.LocalDate;

public class Person {  
    private String firstName;
    private String lastName;
    private LocalDate dob;

    public Person(String firstName, String lastName, LocalDate dob) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.dob = dob;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public LocalDate getDob() {
        return dob;
    }

    public void setDob(LocalDate dob) {
        this.dob = dob;
    }

    @Override
    public String toString() {
        return "<Person: firstName=" + firstName + ", lastName=" + lastName + ", dob=" + dob + ">";
    }
}
Centrémonos en el toString()método anulado , que enumera el nombre de la clase, Persona, junto con los valores de los campos de la instancia. En lugar de "codificar" el nombre de la clase, Persona, en la propia cadena podría haber usado el getClass()método para devolver una instancia de la Clase, que contendrá esa información y me permitirá usarla así:
public class Person {  
    // omitting everyting else remaining the same

    @Override
    public String toString() {
        Class c = getClass();
        return "<" + c.getName() + ": firstName=" + firstName + ", lastName=" + lastName + ", dob=" + dob + ">";
    }
}
Esto llevaría a reemplazar el texto original de "Persona" codificado por el nombre de clase completamente calificado de "com.adammcquistan.object.Person". La clase de clase está repleta de diferentes métodos que le permiten identificar todo tipo de cosas sobre el objeto de clase al que getClass()se llamó.
Por ejemplo, si quisiera obtener una toString()representación más simplificada de mi Personclase, simplemente podría intercambiar la c.getName()llamada c.getSimpleName()como se muestra a continuación. A su vez, esto devolvería "Persona" en lugar del nombre de clase completo "com.adammcquistan.object.Person".
public class Person {  
    // omitting everyting else remaining the same

    @Override
    public String toString() {
        Class c = getClass();
        return "<" + c.getSimpleName() + ": firstName=" + firstName + ", lastName=" + lastName + ", dob=" + dob + ">";
    }
}
Una diferencia importante en la semántica de cómo getClass()se usa en comparación con los otros Objectmétodos es que getClass()no se puede anular porque se declara como un finalmétodo.

¿Para qué sirve el objeto de clase?

En este punto, puede que se esté preguntando: "Ok, creo que es muy bueno poder obtener información sobre una clase llamando a getClass () y recuperando su representación de objeto Clase, pero, ¿qué me resulta útil como programador?". Créeme, también me he hecho esta pregunta y mi conclusión general ha sido ... no lo es. Al menos no es realmente desde la perspectiva de un programador cotidiano . Sin embargo, si resulta que usted es un desarrollador de bibliotecas o marcos, es probable que se familiarice con la información y el comportamiento de los Classobjetos porque es esencial para el concepto conocido como reflexión .
La reflexión permite dos cosas principales: (i) la investigación en tiempo de ejecución de los objetos y sus contenidos y, (ii) el acceso dinámico a los campos y la ejecución de métodos durante el tiempo de ejecución.
El elemento número uno ya se demostró anteriormente al usarlo getClass()para obtener una representación en tiempo de ejecución de la Personclase para acceder al nombre de la clase completamente calificado o simple en una versión modificada del toString()método.
El segundo elemento es un poco más complicado para un ejemplo, pero es algo muy útil para poder acceder a los metadatos en una clase. Parte de la información de la que puede interrogar una instancia Classson cosas como constructores, campos y métodos, además de otras cosas como las jerarquías de herencia de una clase, como sus súper clases e interfaces.
Un ejemplo de esto es la capacidad de usar los depuradores en un IDE como Eclipse y Netbeans para ver al miembro y sus valores en una clase mientras el programa está en ejecución.
Tomemos por ejemplo lo siguiente:
public class Main {  
    public static void main(String[] args) {
        Person me = new Person("Adam", "McQuistan", LocalDate.parse("1987-09-23"));

        Class c = me.getClass();
        for (Field f : c.getDeclaredFields()) {
            f.setAccessible(true);
            try {
                System.out.println(f.getName() + " = " + f.get(me));
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }
}
Saldría lo siguiente:
firstName = Adam  
lastName = McQuistan  
dob = 1987-09-23  
Nuevamente, ningún no masoquista probablemente haría esto en la programación diaria regular, pero verá este tipo de cosas que se hacen a menudo en marcos.

Conclusión

En este artículo describí el significado y el uso del misterioso getClass()método de la clase de objetos Java. He mostrado cómo se puede usar para obtener metadatos en una instancia de clase, como el nombre de la clase de un objeto en tiempo de ejecución, así como una explicación de por qué el acceso a una instancia de clase puede ser útil.
Como siempre, gracias por leer y no tenga miedo de comentar o criticar a continuación.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas