¿Cuál es el rol de un ClassLoader en Java?



Este artículo es una guía completa sobre cómo funciona ClassLoader en Java. Analiza los tipos, principios y métodos de ClassLoader en Java.

Mientras trabajamos en Java, a menudo usamos una gran cantidad de clases. Estas clases de Java no se cargan todas a la vez en la memoria, sino que se cargan cuando lo requiere una aplicación. Aquí es donde entran en escena los Java ClassLoaders. Entonces, en este artículo, discutiré cómo usar ClassLoader en Java junto con ejemplos.

Los siguientes temas se tratarán en este artículo:





  1. ¿Qué es ClassLoader?
  2. Tipos de ClassLoader
  3. Principios de ClassLoader
  4. Métodos de ClassLoader
  5. Cargador de clases personalizado

¡Empecemos!

¿Qué es ClassLoader en Java?

ClassLoader en Java es llamado por Java Runtime Environment para cargar dinámicamente las clases siempre que lo requiera la aplicación en el máquina virtual de Java . Dado que los ClassLoaders son parte del entorno de ejecución de Java, la máquina virtual de Java no tendrá ni idea de los archivos y sistemas de archivos subyacentes.



Ahora, comprendamos los diferentes tipos de ClassLoaders integrados en Java.

Tipos de ClassLoader en Java

Los diferentes tipos de ClassLoaders en Java son los siguientes:

Discutamos cada uno de ellos uno por uno.



Cargador de clases de extensión

Como sugiere el nombre, Extension ClassLoader carga las extensiones de las clases principales de Java desde el JDK Biblioteca de extensión. Es un elemento secundario de Bootstrap ClassLoader y carga las extensiones desde el directorio JRE / lib / text o cualquier otro directorio especificado en la propiedad del sistema java.ext.dirs.

Cargador de clases de aplicación o sistema

La aplicación o el cargador de clases del sistema es un elemento secundario del cargador de clases de extensión. Este tipo de ClassLoader carga todas las clases de nivel de aplicación que se encuentran en la opción de línea de comandos -cp o en la variable de entorno CLASSPATH.

diferencia entre ágil y devops

Bootstrap ClassLoader

Como todos sabemos que Clases de Java son cargados por una instancia de java.lang.ClassLoade. Pero, dado que ClassLoaders son clases, Bootstrap ClassLoader es responsable de cargar las clases internas del JDK. BootStrap ClassLoader es un código de máquina que inicia la operación cuando JVM lo llama y carga las clases desde rt.jar. Por lo tanto, puede comprender que Bootstrap ClassLoader sirve no tiene un ClassLoader principal y, por lo tanto, se conoce como Primordial ClassLoader.

Nota: La prioridad de Bootstrap es mayor que Extension, y la prioridad dada a Extension ClassLoader es mayor que Application ClassLoader. Consulte la imagen siguiente:

Tipos de ClassLoader - ClassLoader en Java - Edureka

A continuación, en este artículo, comprendamos los principios sobre los que funciona ClassLoader.

Principios de ClassLoader en Java

El conjunto de reglas basadas en el funcionamiento de Java ClassLoader son los siguientes tres principios:

Entendamos cada uno de ellos.

Propiedad de singularidad

Esta propiedad asegura que no haya repetición de clases y que todas las clases sean únicas. La propiedad de unicidad también asegura que las clases cargadas por el ClassLoader padre no sean cargadas por el ClassLoader hijo. En un escenario, donde el ClassLoader padre no puede encontrar la clase, la instancia actual intentará hacerlo por sí misma.

Modelo de delegación

ClassLoader en Java funciona en base al conjunto de operaciones dadas por el Modelo de Delegación. Por lo tanto, siempre que se genere una solicitud para encontrar una clase o un recurso, una instancia de ClassLoader delegará la búsqueda de la clase o el recurso al ClassLoader principal.

El conjunto de operaciones en función de las cuales funciona ClassLoader es el siguiente:

  • La máquina virtual Java comprueba si la clase está cargada o no, siempre que se encuentra con una clase.
  • En el caso de que se cargue la clase JVM procede con la ejecución de la clase, pero en un escenario donde la clase no está cargada, entoncesJVM solicita al subsistema Java ClassLoader que cargue esa clase en particular. Después de eso, el subsistema ClassLoader le da control a Application ClassLoader.
  • El Application ClassLoader luego delega la solicitud al Extension ClassLoader, que luego pasa la solicitud al Bootstrap ClassLoader.
  • Ahora, Bootstrap ClassLoader busca en elBootstrap classpath para verificar si la clase está disponible o no. Si la clase está disponible, entonces se carga; de lo contrario, la solicitud se pasa nuevamente a Extension ClassLoader.
  • Extension ClassLoader comprueba la clase en la ruta de clases de extensión.Si la clase está disponible, se carga; de lo contrario, la solicitud se pasa nuevamente al cargador de clases de aplicación.
  • Finalmente, Application ClassLoader busca la clase en la ruta de clases de la aplicación.Si la clase está disponible, entonces se carga; de lo contrario, verá una excepción de ClassNotFoundException.

Consulte la imagen a continuación.

Principio de visibilidad

De acuerdo con este principio, las clases secundarias son visibles para las clases cargadas por sus ClassLoaders principales, pero lo contrario no es cierto. Por lo tanto, las clases cargadas por Application ClassLoader tienen visibilidad de las clases cargadas por Extension y Bootstrap ClassLoader.

Por ejemplo, si tenemos dos clases: A y B, supongamos que el ClassLoader de aplicación carga la clase A y el ClassLoader de extensiones carga la clase B. Aquí, las clases A y B son visibles para todas las clases cargadas por Application ClassLoader, pero la clase B es visible solo para aquellas clases cargadas por Extension ClassLoader.

Además, si intenta cargar estas clases utilizando Bootstrap ClassLoader, verá el java.lang.ClassNotFoundException . excepción.

Muy bien, ahora que conoce los tipos de ClassLoaders y los principios detrás de ellos, analicemos algunos métodos importantesdesde el java.lang.ClassLoader clase.

Métodos de ClassLoader en Java

Pocos imprescindibles de ClassLoader son los siguientes:

loadClass (nombre de cadena, resolución booleana)

Este método es el punto de entrada del ClassLoader y se utiliza para cargar la clase a la que hace referencia la JVM. Toma el nombre del como parámetro. La JVM invoca el método loadClass () para resolver las referencias de clase estableciendo el valor booleano en verdadero. Solo si necesitamos determinar si la clase existe o no, el parámetro booleano se establece en falso.

Declaración:

loadClass de clase pública (nombre de cadena, resolución booleana) lanza ClassNotFoundException {

defineClass ()

Un método final utilizado para definir una matriz de bytes como instancia de una clase. En caso de que la clase no sea válida, arroja un ClassFormatError.

Declaración:

protegida final Class defineClass (String name, byte [] b, int off, int len) arroja ClassFormatError

findClass (nombre de la cadena)

El método findClass se usa para encontrar la clase especificada. Por lo tanto, solo encuentra la clase con un nombre completo como parámetro, pero no carga la clase. El método loadClass () invoca este método si el ClassLoader padre no puede encontrar la clase solicitada. Además, si ningún padre del ClassLoader encuentra la clase, la implementación predeterminada arroja un ClassNotFoundException.

Declaración:

La clase protegida findClass (nombre de cadena) lanza ClassNotFoundException

Class.forName (nombre de cadena, inicialización booleana, cargador de ClassLoader)

Este método se utiliza para cargar e inicializar la clase. Da la opción de elegir cualquiera de los ClassLoaders y en caso de que el parámetro ClassLoader sea NULL, automáticamente se usa Bootstrap ClassLoader.

Declaración:

Public static Class forName (nombre de cadena, inicialización booleana, cargador ClassLoader) lanza ClassNotFoundException

getParent ()

El método getParent se usa para devolver el ClassLoader principal para la delegación.

Declaración:

public final ClassLoader getParent ()

getResource ()

Como sugiere el nombre, el método getResource () intentó encontrar un recurso con el nombre de pila. Inicialmente, delegará la solicitud al ClassLoader principal para el recurso. En caso de que el padre sea nulo, se busca la ruta de ClassLoader integrado en la JVM. Ahora, si esto falla, el método invocará findResource (String) para encontrar el recurso, donde el nombre del recurso se especifica como una entrada que puede ser la ruta de clases absoluta o relativa. Luego, devuelve un objeto URL para leer el recurso o devuelve un valor nulo si el recurso no tiene los privilegios adecuados para devolver el recurso o no se encuentra.

Declaración:

getResource URL pública (nombre de cadena)

A continuación, en este artículo sobre ClassLoader en Java, comprendamos el ClassLoader personalizado.

Cargador de clases personalizado en Java

Los ClassLoaders integrados se encargarán de la mayoría de los casos en los que los archivos ya están en el sistema de archivos, pero si desea cargar las clases desde el disco duro local, entonces debe utilizar ClassLoaders personalizados.

Crear cargador de clases personalizado

Para crear un ClassLoader personalizado, necesita ampliar el ClassLoader clase y anular la findClass () método:

Ejemplo: Creemos un ClassLoader personalizado que amplíe el ClassLoader predeterminado y cargue una matriz de bytes del archivo especificado. Consulte el código a continuación.

paquete edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream public class Ejemplo amplía ClassLoader {@Override public Class findClass (String samplename) arroja ClassNotFoundException {byte [] b = customLoadClassFromFile (samplename) return defineClass (samplename, b, 0, b.length)} byte privado [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.', File. separatorChar) + '.class') byte [] buffer ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () return buffer}}

Con esto, llegamos al final de este artículo sobre ClassLoader en Java. Espero que hayas entendido qué son los ClassLoaders en Java, sus métodos, los diferentes tipos de ClassLoaders, etc.

Si encontró este artículo sobre 'ClassLoader en Java', consulte el por Edureka, una empresa de aprendizaje en línea de confianza con una red de más de 250.000 alumnos satisfechos repartidos por todo el mundo. Estamos aquí para ayudarlo en cada paso de su viaje, para convertirse además de las preguntas de esta entrevista en Java, creamos un plan de estudios diseñado para estudiantes y profesionales que desean ser un Java Desarrollador.

Tienes una pregunta para nosotros? Por favor, menciónelo en la sección de comentarios de este 'ClassLoader en Java y nos pondremos en contacto contigo lo antes posible.