26- encargo métodos de análisis de cargador de clases sistema de código fuente subyacente y forName análisis

Análisis de código de encargo cargador de clases del sistema y los métodos de análisis subyacentes forName

java.lang.Class
public static Class<?> forName(@NonNls String name,
                            boolean initialize,
                            ClassLoader loader)
                    throws ClassNotFoundException

Devuelve el objeto de clase asociado a la clase o interfaz con el nombre de cadena dado, utilizando el cargador de clases determinada. Dado el nombre completo de una clase o interfaz (en el mismo formato devuelto por getName) Este método intentos de localizar, cargar y vincular la clase o interfaz. El cargador de clase especificada se utiliza para cargar la clase o interfaz. Si el gestor de parámetro es nulo, la clase se carga a través del cargador de clases bootstrap. La clase es inicializada sólo si el parámetro de inicialización es cierto y si no se ha inicializado antes.

Aplicaciones de la carga determinada clase devuelve el objeto de la clase que tiene una interfaz para la clase asociada con un nombre determinado o una cadena de caracteres. determinada clase o nombre completo de la interfaz (retornos getName utilizando el mismo formato), los intentos método para localizar, cargar y vincular la clase o interfaz. cargador de clases definido para cargar las clases o interfaces. Si el parámetro de carga está vacío, entonces el (raíz) cargador de clases para cargar la clase de partida. Sólo cuando el parámetro de inicialización es cierto y no se ha inicializado previamente, se inicializará la clase.

Si el nombre denota un tipo primitivo o nula, se hará un intento de localizar una clase definida por el usuario en el paquete anónimo cuyo nombre es nombre. Por lo tanto, este método no puede utilizarse para obtener cualquiera de la clase de objetos que representan los tipos primitivos o vacío.

Si el nombre representa un tipo primitivo o nula, se tratará de nombrar el nombre del paquete no identificado para encontrar las clases definidas por el usuario. Por lo tanto, este método no puede ser utilizado para obtener los objetos originales representan ningún tipo o clase de vacío.

Si nombre denota una clase de matriz, el tipo de componente de la clase de matriz es cargado pero no inicializado.
Por ejemplo, en un método de instancia la expresión:
Class.forName ( “Foo”)
es equivalente a: (上面的表达式,等价于下面的)
Class.forName ( “Foo”, es cierto, this.getClass (). getClassLoader ())
Tenga en cuenta que este método genera errores relacionados con la carga, que se vinculen o inicialización como se especifica en las Secciones 12.2, 12.3 y 12.4 de la especificación del lenguaje Java. Tenga en cuenta que este método no comprueba si la clase solicitada es accesible a su llamador.

Tenga en cuenta que este método produce asociado con la carga, o errores de inicialización de enlace, como se describe en la Sección 12.2, 12.3 y 12.4 especificación del lenguaje Java. Tenga en cuenta que este método no comprueba si la clase solicitada se puede acceder por la persona que llama.

Si el cargador es nulo, y un controlador de seguridad está presente, y el cargador de clases de la persona que llama no es nulo, entonces este método llama al método checkPermission del gerente de seguridad con un RuntimePermission ( “getClassLoader”) permiso para asegurarse de que está bien para acceder a la clase de arranque cargador.

Si el cargador está vacío y no es un administrador de seguridad, y llamar a la fiesta de cargador de clases no está vacío, este método utiliza RuntimePermission ( "getClassLoader") permiso para llamar al método checkPermission del gerente de seguridad para asegurarse de que se puede acceder al cargador de clases de arranque dispositivo.

Parámetros:
nombre - nombre totalmente cualificado de la clase deseada
initialize - si es verdad se inicializará la clase. Vea la Sección 12.4 de la especificación del lenguaje Java.
loader - cargador de clase de la cual la clase debe estar cargado
Devuelve:
objeto de la clase que representa la clase deseada //表示所需类的类对象

Class.forName 方法:

public static Class<?> forName(String name, boolean initialize,
                               ClassLoader loader)
   throws ClassNotFoundException
    {
        Class<?> caller = null;
        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            // Reflective call to get caller class is only needed if a security manager
            // is present.  Avoid the overhead of making this call otherwise.
            caller = Reflection.getCallerClass(); //获取调用forName方法的那个Class对象。
            if (sun.misc.VM.isSystemDomainLoader(loader)) { 
            	//ccl:获取调用forName方法的那个Class对象的类加载器
            	ClassLoader ccl = ClassLoader.getClassLoader(caller);
                if (!sun.misc.VM.isSystemDomainLoader(ccl)) {
                    sm.checkPermission( //进行一个安全性检查
                        SecurityConstants.GET_CLASSLOADER_PERMISSION);
                }
            }
        }
        return forName0(name, initialize, loader, caller);//这个方法是一个native方法,查看不了源码!
}
Publicado 25 artículos originales · ganado elogios 0 · Vistas 1447

Supongo que te gusta

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