Maison >Java >javaDidacticiel >Réflexion Java avancée

Réflexion Java avancée

黄舟
黄舟original
2017-02-24 09:47:471384parcourir


Nous utilisons généralement la réflexion La première méthode, jetons d'abord un coup d'œil à Class.forName(clssName) :
Remarque : le nom de classe entrant doit êtreLe chemin complet de la classe , sinon une erreur java.lang.ClassNotFoundException sera signalée.

public static Class<?> forName(String className)                
throws ClassNotFoundException {        
return forName0(className, true, ClassLoader.getCallerClassLoader());
    }

En appelant la méthode forName0, utilisez ClassLoader.getCallerClassLoader() pour charger le ClassLoader

    // Returns the invoker&#39;s class loader, or null if none.
    // NOTE: This must always be invoked when there is exactly one intervening
    // frame from the core libraries on the stack between this method&#39;s
    // invocation and the desired invoker.
    static ClassLoader getCallerClassLoader() {
        // NOTE use of more generic Reflection.getCallerClass()
        Class caller = Reflection.getCallerClass(3);
        // This can be null if the VM is requesting it        
        if (caller == null) {            
        return null;
        }
        // Circumvent security check since this is package-private        
        return caller.getClassLoader0();
    }

Appelez claser.getClassLoader0() pour obtenir le ClassLoader This. est un package privé, peut éviter les contrôles de sécurité.

 // Package-private to allow ClassLoader access
    native ClassLoader getClassLoader0();

1. Qu'est-ce que ClassLoader ?

Nous utilisons généralement la réflexion La première méthode, jetons d'abord un coup d'œil à Class.forName(clssName) :
Remarque : Le className transmis doit être le chemin complet de la classe , sinon une erreur java.lang.ClassNotFoundException sera signalée.

public static Class<?> forName(String className)                
throws ClassNotFoundException {        
return forName0(className, true, ClassLoader.getCallerClassLoader());
    }

En appelant la méthode forName0, utilisez ClassLoader.getCallerClassLoader() pour charger le ClassLoader

    // Returns the invoker&#39;s class loader, or null if none.
    // NOTE: This must always be invoked when there is exactly one intervening
    // frame from the core libraries on the stack between this method&#39;s
    // invocation and the desired invoker.
    static ClassLoader getCallerClassLoader() {
        // NOTE use of more generic Reflection.getCallerClass()
        Class caller = Reflection.getCallerClass(3);
        // This can be null if the VM is requesting it        
        if (caller == null) {            
        return null;
        }
        // Circumvent security check since this is package-private        
        return caller.getClassLoader0();
    }

Appelez claser.getClassLoader0() pour obtenir le ClassLoader This. est un package privé, peut éviter les contrôles de sécurité.

 // Package-private to allow ClassLoader access
    native ClassLoader getClassLoader0();

1. Qu'est-ce que ClassLoader exactement ?

Ce qui précède est le contenu de la réflexion avancée en Java. Pour plus de contenu connexe, veuillez prêter attention au site Web PHP chinois (www.php. .cn) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn