M茅todos de objetos 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 Object 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 enlaces a cada art铆culo de esta serie.

    • Encadenar
    • getClass (est谩s aqu铆)
    • es igual a
    • c贸digo hash
    • clon
    • finalizar
    • esperar y notificar

    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 algo confuso o incomprendido getClass() devuelve una instancia de la clase Class, que contiene informaci贸n sobre la clase que getClass() fue llamado desde. Vaya, si ya no est谩s confundido por esa 煤ltima declaraci贸n, bien por ti, 隆porque lo estoy y lo escrib铆!

    Perm铆tanme intentar descomponer esa oraci贸n con una demostraci贸n de c贸mo podr铆a usarse. A continuaci贸n encontrar谩 el Person clase que utilic茅 en el art铆culo inicial sobre la clase Object toString() m茅todo.

    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 lo anulado toString() m茅todo, 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 Class, 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 codificado “Person” con el nombre de clase completamente calificado de “com.adammcquistan.object.Person”. La clase Class est谩 repleta de diferentes m茅todos que le permiten identificar todo tipo de cosas sobre el objeto de clase que getClass() fue llamado.

    Por ejemplo, si quisiera obtener una versi贸n m谩s simplificada toString() representaci贸n de mi Person clase simplemente podr铆a cambiar el c.getName() llamar con c.getSimpleName() como se muestra a continuaci贸n. Esto a su vez devolver铆a “Person” 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 gran diferencia en la sem谩ntica de c贸mo getClass() se utiliza en comparaci贸n con el otro Object m茅todos es que getClass() no se puede anular porque se declara como final m茅todo.

    驴Para qu茅 sirve el objeto Class?

    En este punto, es posible que se est茅 preguntando: “Ok, supongo que es muy bueno que pueda obtener informaci贸n sobre una clase llamando a getClass () y recuperando su representaci贸n del objeto Class, pero 驴c贸mo me resulta 煤til como programador?” Cr茅ame, yo 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 es un desarrollador de bibliotecas o frameworks, es probable que se familiarice con la informaci贸n y el comportamiento de Class objetos porque es esencial para el concepto conocido como reflexi贸n.

    La reflexi贸n permite dos cosas principales: (i) investigaci贸n en tiempo de ejecuci贸n de objetos y su contenido y (ii) acceso din谩mico a campos y ejecuci贸n de m茅todos durante el tiempo de ejecuci贸n.

    El elemento n煤mero uno ya se demostr贸 anteriormente usando getClass() para obtener una representaci贸n en tiempo de ejecuci贸n del Person class para acceder al nombre de clase completo o simple en una versi贸n modificada del toString() m茅todo.

    El segundo elemento es un poco m谩s complicado para preparar un ejemplo, pero es algo muy 煤til para poder acceder a los metadatos en una clase. Parte de la informaci贸n que puede interrogar una instancia de Class porque son cosas como constructores, campos y m茅todos adem谩s de otras cosas como jerarqu铆as de herencia de una clase, como sus superclases e interfaces.

    Un ejemplo de esto es la capacidad de usar 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();
                }
    
            }
        }
    }
    

    Producir铆a lo siguiente:

    firstName = Adam
    lastName = McQuistan
    dob = 1987-09-23
    

    Una vez m谩s, ning煤n no masoquista probablemente har铆a esto en la programaci贸n diaria normal, pero ver谩 que este tipo de cosas se hacen a menudo en los marcos.

    Conclusi贸n

    En este art铆culo describ铆 el significado y uso del misterioso getClass() m茅todo de la clase Java Object. 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, y tambi茅n proporcion茅 una explicaci贸n de por qu茅 puede ser 煤til acceder a una instancia de clase.

    Como siempre, gracias por leer y no dude en comentar o criticar a continuaci贸n.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *