Heim  >  Artikel  >  Java  >  Reflexion basierend auf Java

Reflexion basierend auf Java

yulia
yuliaOriginal
2018-09-10 16:33:591059Durchsuche

Wie erstelle ich ein Klassenobjekt? Es gibt zwei Möglichkeiten:
class.forName("class name");
Class a = a.class;
Der Unterschied zwischen den beiden ist: forName() hilft Ihnen bei der Initialisierung der statischen Variablen und; Klasse a = a.class muss statische Variablen selbst initialisieren; durch Reflexion kann die Methode des Objekts von Klasse zu geändert werden ein Objekt; nstanceof kann bestimmen, ob eine Klasse zu einer anderen Klasse gehört, um bei der Abwärtstransformation zu beurteilen: Konstruktoren, Mitgliedsvariablen, Mitgliedsmethoden und Zugriffsmitglieder von eine bestimmte Klasse;

class.getConstructors(); Holen Sie sich alle Konstruktoren; >class. getConstructor(null); Holen Sie sich den öffentlichen Konstruktor ohne Parameter;

 Mitgliedsvariablen abrufen:

class.getFields(); Alle öffentlichen Felder abrufen
class.getField(); "name"); Holen Sie sich ein bestimmtes öffentliches Feld (name); Holen Sie sich ein bestimmtes privates Feld phoneNum; .set(obj, „Andy Lau“); darunter ist unser obj ein von unserer Klasse generiertes Objekt:

class.getMethods(); alle öffentlichen Methoden;
class.getDeclaredMethods(); Holen Sie sich alle Methoden; class.getMethod("Methodenname", String.class); Holen Sie sich eine einzelne spezifische Methode; ; gibt ein Methodenobjekt zurück; dann müssen wir wie bei einem Feld zuerst ein Objekt generieren. In diesem Fall verwenden wir die Methodenausführungsfunktion invoke() Objekt, und 20 ist der Parameter;
kann sogar unsere main()-Methode widerspiegeln class.getMethod("main", Stirng[].class); Um Reflektion zu implementieren, neue Klassen zu erstellen und Methoden auszuführen, verwenden Sie Reflektion, um generische Prüfungen zu vermeiden: Wir können sogar die Klassendatei eines bestimmten Containers aufrufen und dann seine Methode aufrufen, um das Problem der generischen Prüfung zu vermeiden Darüber hinaus können wir den dynamischen Proxy-Modus auch durch Reflektion implementieren:

interface Subject{
    public void doSomething();
}
class RealSubject implements Subject{
    public void doSomething(){
        System.out.println("call doSomething()");    
    }
}
class ProxyHandler implements InvocationHandler{
    private Object tar;
    public Object bind(Object tar){
       this.tar = tar;
       return Proxy.newProxyInstance(tar.getClass().getClassLoader(),
                                      tar.getClass().getInterfaces(),
                                      this);
     }
     public Object invoke(Object proxy, Method method ,Object[] args) throws Throwable{
         Object result = null;
        result = method.invoke(tar,args);
        return result;
    }
}
public class Test
{
    public static void main(String[] args[]){
        ProxyHandler proxy = new ProxyHandler();
        Subject sub = (Subject) proxy.bind(new RealSubject());
        sub.doSomething();
    }
}

Ein ProxyHandler wird zur Implementierung verwendet. Von der InvocationHandler-Schnittstelle wird ein Proxy-Objekt durch Übergabe eines realen Objekts erhalten. Die erforderlichen Parameter sind: tar .getClass().getClassLoader() der Klassenlader des realen Objekts, tar.getClass().getInterfaces() das reale Objekt Die Schnittstelle sowie dieser und der InvocationHandler selbst erhalten über den Reflexionsmechanismus ein Proxy-Objekt Schreiben Sie gleichzeitig unser reales Objekt zur Ausführung in die Methodenausführungsfunktion dieses Proxy-Objekts. Um bei nachfolgenden Methodenaufrufen zuerst die Methode unseres realen Objekts aufzurufen, denken Sie daran, das Objekt beim Aufrufen der Bindung des Proxy-Objekts in das reale Objekt umzuwandeln.

Das obige ist der detaillierte Inhalt vonReflexion basierend auf Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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