14-ClassLoader fuente Análisis Análisis Ejemplo

ClassLoader instancia de análisis de código fuente y de perfiles

clase abstracta pública cargador de clases de objetos se extiende

Un cargador de clases es un objeto que se encarga de cargar las clases. El cargador de clases de la clase es una clase abstracta. Dado el nombre del binario de una clase, un cargador de clases debe intentar localizar o generar datos que constituye una definición para la clase. Una estrategia típica es la de transformar el nombre en un nombre de archivo y luego leer un “archivo de clase” de ese nombre a partir de un sistema de archivos.

cargador de clases de objetos se encarga de cargar las clases. Cargador de clases es una clase abstracta. Nombre binario dado a una clase, el cargador de clases debe tratar de encontrar (ubicación) o los datos de generación que constituye la definición de clase. Una estrategia típica es la de convertir el nombre del nombre de archivo, y luego lee desde el sistema de archivos "archivo de clase."

objeto Cada clase contiene una referencia a la ClassLoader que definió.

Cada objeto clase contiene una referencia a su cargador de clases definido.

objetos de clase para las clases de matriz no son creados por los cargadores de clases, sino que se crean automáticamente según sea necesario por el tiempo de ejecución de Java. El cargador de clases para una clase de matriz, tal como lo devuelve Class.getClassLoader () es el mismo que el cargador de clases para su tipo de elemento; si el tipo de elemento es un tipo primitivo, entonces la clase array no tiene cargador de clases.

clase de tabla de objeto de clase no es creado por el cargador de clases, pero si es necesario, el tiempo de ejecución de Java crea automáticamente. Para el cargador de clases para la matriz, Class.getClassLoader () Devuelve el cargador de clase de la clase de matriz y de sus elementos del mismo tipo de cargador de clases, si el tipo de elemento es primitivo, entonces el cargador de clases no es una clase de matriz. Los ejemplos específicos de un ver [verificar]

Las aplicaciones implementan las subclases de cargador de clases con el fin de extender la manera en que la máquina virtual de Java clases carga dinámicamente.

Las aplicaciones implementan las subclases de la clase cargador de clases para extender una máquina virtual Java clases carga dinámicamente.

cargadores de clases normalmente pueden ser utilizados por los administradores de seguridad para indicar dominios de seguridad.

Un cargador de clases se indica generalmente por el gerente de seguridad de dominio de seguridad.

La clase ClassLoader utiliza un modelo de delegación para buscar clases y recursos. Cada instancia de cargador de clases tiene un cargador de clases padre asociado. Cuando se le solicite para encontrar una clase o un recurso, una instancia de cargador de clases va a delegar la búsqueda de la clase o el recurso a su cargador de clases padre antes de tratar de encontrar la clase o recurso en sí. La máquina virtual está incorporado en el cargador de clases, llamado el “cargador de clases de arranque”, por sí mismo no tiene un padre, pero puede servir como padre de una instancia de cargador de clases.

clase ClassLoader utiliza un mecanismo de delegación para buscar clases y recursos. Cada instancia del cargador de clases padre tiene un cargador de clases asociado. Cuando una solicitud para encontrar una clase o de recursos, la instancia de cargador de clases intentará encontrar en sí antes de la clase o de recursos , la clase será buscado o los recursos asignados a su cargador de clases padre. cargador de clase de máquina virtual incorporado llamado "arranque (raíz) cargador de clases", que a su vez no tiene padre, pero se puede usar como la clase padre de la instancia cargador de clases.

cargadores de clases que soportan la carga simultánea de clases se conocen como cargadores de clases capaz paralelas y están obligados a registrarse a sí mismos en su tiempo de inicialización de clase invocando el método ClassLoader.registerAsParallelCapable. Tenga en cuenta que la clase cargador de clases se ha registrado como paralelas capaces por defecto. Sin embargo, sus subclases todavía tienen que registrarse ellos mismos si son capaces paralelo.

Soportes cargador de clases concurrentes para cargar una clase llamada apoyo paralelo cargado cargador de clases, es necesario inscribirse llamando al método ClassLoader.registeraspallelable en la inicialización de clase. Tenga en cuenta que, la clase cargador de clases se ha registrado como predeterminado en paralelo con capacidad (con el paralelismo). Sin embargo, si una subclase con capacidad paralela, que todavía tienen que registrarse ellos mismos (que es una subclase de ClassLoader quiere tener paralelismo se consigue a través del registro requerido!).

En entornos en los que el modelo de delegación no es estrictamente jerárquica, cargadores de clases necesitan ser paralelos capaces, de otra manera la carga de clases puede conducir a puntos muertos debido a que el bloqueo del cargador se mantiene durante la duración del proceso de carga de clases (véase métodos loadClass).

En el mecanismo de delegación no es estrictamente jerárquica medio ambiente, las necesidades cargador de clases que tienen la capacidad de paralelo, o la carga de clases pueden llevar a un punto muerto debido a que el bloqueo del cargador se mantiene constante durante la duración del proceso de carga de clases (es decir, el cargador en el proceso de carga de clase ha sido que mantiene el bloqueo) (véase el método loadClass).

Normalmente, las clases virtuales máquina carga Java desde el sistema de archivos local de una manera dependiente de la plataforma . Por ejemplo, en sistemas UNIX, los virtuales clases máquina carga desde el directorio definido por la variable de entorno CLASSPATH.

Por lo general, la máquina virtual Java de una manera independiente de la plataforma para cargar las clases del sistema de archivos local. Por ejemplo, en un sistema UNIX, los virtuales clases de carga de la máquina desde un directorio definido por la variable de entorno CLASSPATH.

Sin embargo, algunas clases no pueden proceder de un archivo; que pueden originarse a partir de otras fuentes, tales como la red, o podrían ser construido por una aplicación. El método defineClass convierte una matriz de bytes en una instancia de la clase Class. Las instancias de esta clase recién definido se pueden crear utilizando Class.newInstance.

Sin embargo, algunas clases no pueden proceder de un archivo, sino que se pueden derivar de otras fuentes, tales como una red, o pueden ser configurados por la aplicación. método ①defineClass convierte una matriz de bytes en una instancia de la clase Class. Ejemplos ② La clase recién definida puede ser creado usando class.newInstance.

---- De hecho, aquí se describen los dos primeros pasos ① y luego ②.

Los métodos y constructores de objetos creados por un cargador de clases pueden hacer referencia a otras clases. Para determinar la clase (s) a que se refiere, la máquina virtual de Java invoca el método loadClass del cargador de clases que creó originalmente la clase.

objetos creados cargador métodos y constructores de clase pueden hacer referencia a otras clases. Para determinar el tipo de referencia, la máquina virtual de Java puede llamar al método loadClass creado originalmente el cargador de clases de la clase.

Por ejemplo, una aplicación podría crear un cargador de clases de red para descargar archivos de clase desde un servidor. código de ejemplo podría ser:

Por ejemplo, una aplicación puede crear un cargador de clases de red para descargar archivos de clase desde el servidor. código de ejemplo puede tener este aspecto:

ClassLoader loader = new NetworkClassLoader(host, port);
Object main = loader.loadClass("Main", true).newInstance();
. . .

El cargador subclase clase de red debe definir los métodos FindClass y loadClassData para cargar una clase de la red. Una vez que haya descargado los bytes que componen la clase, se debe utilizar el método defineClass para crear una instancia de clase. Una implementación de ejemplo es:

Red de cargador de clases subclase debe definir el método FindClass y loadClassData a clases de carga de la red. Una vez que el tipo de configuración de descarga de bytes, se debe crear un método defineClass instancia de clase. implementación de ejemplo es:

class NetworkClassLoader extends ClassLoader {
   String host;
   int port;
   public Class findClass(String name) {
        byte[] b = loadClassData(name);
        return defineClass(name, b, 0, b.length);
   }
   private byte[] loadClassData(String name) {
        // load the class data from the connection
         . . .
   }
}

Nombres binarios:
Cualquier nombre de la clase proporcionada como un parámetro de cadena de métodos de cargador de clases debe ser un nombre binario como se define por The Java Language Specification ™.
Ejemplos de nombres de clase válidos incluyen:

Como parámetro de cadena a cualquier método del nombre de la clase en el nombre del archivo binario cargador de clases debe ser definida por la especificación del lenguaje Java ™.

Ejemplos de nombre válido de clase comprende:

"java.lang.String"
"javax.swing.JSpinner$DefaultEditor"
"java.security.KeyStore$Builder$FileBuilder$1"
"java.net.URLClassLoader$3$1"
  • Ejemplo uno:

    public class MyTest15 {
        public static void main(String[] args) {
            String[] strings = new String[2];
            System.out.println(strings.getClass().getClassLoader());
    
            System.out.println("-----------------");
    
            MyTest15[] myTest15s = new MyTest15[2];
            System.out.println(myTest15s.getClass().getClassLoader());
    
            System.out.println("-----------------");
    
            int[] ints = new int[2];
            System.out.println(ints.getClass().getClassLoader());
        }
    }
    运行结果:
          null     //这个null是根类加载器,并不是没有加载器
          -----------------
          sun.misc.Launcher$AppClassLoader@18b4aac2
          -----------------
          null	   //这个null是没有加载器,因为int是基本类型
    
Publicado 12 artículos originales · ganado elogios 0 · Vistas 190

Supongo que te gusta

Origin blog.csdn.net/qq_40574305/article/details/104784596
Recomendado
Clasificación