Heim  >  Artikel  >  Java  >  Erweiterte Java-Reflektion

Erweiterte Java-Reflektion

黄舟
黄舟Original
2017-02-24 09:47:471361Durchsuche


Wir verwenden normalerweise Reflexion Der erste Weg, werfen wir zunächst einen Blick auf Class.forName(clssName):
Hinweis: Der eingehende Klassenname muss seinDer vollständige Pfad der Klasse , andernfalls wird ein Fehler java.lang.ClassNotFoundException gemeldet.

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

Durch Aufrufen der forName0-Methode können Sie mit ClassLoader.getCallerClassLoader() den ClassLoader laden.

    // 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();
    }

Rufen Sie claser.getClassLoader0() auf, um den ClassLoader abzurufen Da es sich um ein privates Paket handelt, können Sicherheitskontrollen vermieden werden.

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

1. Was ist ClassLoader?

Wir verwenden normalerweise Reflection Der erste Weg, schauen wir uns zunächst Class.forName(clssName) an:
Hinweis: Der eingehende Klassenname muss der vollständige Pfad der -Klasse sein, andernfalls wird ein Fehler java.lang.ClassNotFoundException gemeldet.

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

Durch Aufrufen der forName0-Methode können Sie mit ClassLoader.getCallerClassLoader() den ClassLoader laden.

    // 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();
    }

Rufen Sie claser.getClassLoader0() auf, um den ClassLoader abzurufen Da es sich um ein privates Paket handelt, können Sicherheitskontrollen vermieden werden.

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

1. Was genau ist ClassLoader?

Das Obige ist der Inhalt der erweiterten Reflexion in Java. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website .cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn