Vorwort:
In jüngster Zeit wird das Unternehmen einen Geschäftskomponentierungsprozess unterzogen, und die Routing -Implementierung verwendet den Reflexionsmechanismus von Java. Da es verwendet wird, möchte ich es sorgfältig studieren und zusammenfassen. Unabhängig davon, ob es sich um die vorherige Eventbus 2.x -Version, die Nachrüstung oder das Framework der frühen Ansicht handelt, verwendet es den Reflexionsmechanismus von Java in größerem oder geringem Ausmaß.
Was ist der Java -Reflexionsmechanismus?
Der Java -Reflexionsmechanismus ist, dass Sie für jede Klasse alle Eigenschaften und Methoden dieser Klasse kennen. Für jedes Objekt können Sie eine beliebige Methode seines dynamisch erfassten und dynamischen Aufrufs der Objektmethode als Java -Reflexionsmechanismus bezeichnen.
Welche Funktionen bietet der Reflexionsmechanismus?
Java Reflection Mechanism Class:
Java.lang.Class; // Klasse java.lang.reflect.Constructor; // Konstruktormethode java.lang.reflect.field; // Klassenmitgliedsvariable java.lang.reflect.Method; // Klassenmethode java.lang.reflect.modifier; // Zugriff auf Berechtigungen
Implementierung von Java Reflection Mechanismus:
1.) Klassenobjekt erhalten
// Die erste Methode besteht darin, das Objekt GetClass -Methode Person Person = New Person () zu verwenden; Klasse <?> Class1 = Person.getClass (); // Die zweite Methode besteht darin, die Klasse der Klasse zu verwenden. (ClassNotFoundException e) {e.printstacktrace ();}2.) Holen Sie sich die zusammenfassenden Informationen des Klassenobjekts
boolean iSprimitive = class1.iprimitive (); // beurteilen, ob es sich um den grundlegenden Typ boolean isarray = class1.isarray (); // beurteilen, ob es sich um eine Sammlungsklasse boolean iannotation = class1.isAnnotation (); // beurteilen, ob es sich class1. isenum (); // beurteilen, ob es sich um eine booleanische IsanonymouSclasse der Enum -Klasse handelt. Enthält das Paketname -Pfad -Paket apackage = class1.getPackage (); // Klassenpaketinformationen String SimpleName = class1.getSimplename (); // Klassenname in int modifiers = class1.getModifiers (); // Klassenzugriffsberechtigungen Class <> [] DeclaredClasses = Class1.sclaredClaredClored (); class1.getDeclaringClass (); // externe Klasse
3.) Holen Sie sich die Attribute, Methoden, Konstruktoren usw. des Klassenobjekts
Field [] Allfields = class1.getDeclaredfields (); // Erhalten Sie alle Attribute des Klassenobjektfelds [] publicfields = class1.getfields (); // das öffentliche Attribut des Klassenobjekts versehen {Field AGEFIELD = class1.getDeclaredfield ("Age"). of the class} catch (NoSuchFieldException e) { e.printStackTrace();}Method[] methods = class1.getDeclaredMethods();//Get all declaration methods of class object Method[] allMethods = class1.getMethods();//Get all methods of class object including the method of parent class Class parentClass = class1.getSuperclass();//Get the parent class of class Objektklasse <?> [] interfaceClasseses = class1.getInterfaces (); // Erhalten Sie alle Schnittstellen von Klassen -Objektkonstruktor <?> [] AllConstructors = class1.getDeclaredConstructors (); // ALLE ERKRAGERUNGS -Konstrukteure der Klassenkonstruktoren <> [] öffentliche öffentlich -class -Class1.GetCraration 1.GetCrescorors 1.GetCrescorors (). Constructor <?> Constructor = class1.getDeclaredConstructor (neue Klasse [] {String.class}); // Die angegebene Deklaration Constructor PublicConstructor = class1.getConstructor (New Class [] {}); // Die angegebene Deklaration Public Constructor (nosuchthodException E) {E.Printtracta (nosuchthodException e) {E.Printtracta (nosuchtraction (); Annotationen = class1.getAnnotations (); // Alle Annotationen der Annotation der Klassenobjekte erhalten. Alle Schnittstellen des Klassenobjekts 4.) Dynamische Erzeugung von Klassenobjekten
// Die erste Methode des Klassenobjekts ruft die Methode von NewInstance () auf, um Objekt OBJ = class1.NewInstance (); // Die zweite Methode des Objekts erhält das entsprechende Konstruktorobjekt und generiert dann den Konstruktor <? constructor.newinstance (neues Objekt [] {"lcj"});5.) Aufrufen von Funktionen dynamisch aufrufen
Versuchen Sie {// ein neues Objekt generieren: Verwenden Sie das NewInstance () -Methode -Objekt obj = class1.Newinstance (); // beurteilen, ob das Objekt eine Unterklasse von boolean is isinstance von = obj Instance von Person ist; // Zunächst müssen Sie die Methode erhalten, die der Methodenmethodenmethode entspricht. // rufen Sie die angegebene Funktion auf und übergeben Sie die Parametermethode.invoke (OBJ, 28); method = class1.getDeclaredMethod ("getage"); Object result = method.invoke(obj, new Class[]{});} catch (InstantiationException e) { e.printStackTrace();} catch (IllegalAccessException e) { e.printStackTrace();} catch (NoSuchMethodException e) { e.printStackTrace();} catch (InvocationTargetException e) { E. printstacktrace ();} 6.) Erhalten Sie generische Typen durch Reflexionsmechanismus
Zum Beispiel die folgende Struktur
// People Class Public Class People <T> {} // Personklasse erbt People Class Public Class Person <T> Erweitert People <string> implementiert PersonInterface <Ganzzahl> {} // PersonInterface Interface öffentliche Schnittstelle Personinterface <T> {}Erhalten Sie generische Typen
Person <string> person = new Person <> (); // Der erste Weg besteht darin, das Objekt GetClass -Methodenklasse <?> Class1 = Person.getClass () zu verwenden; Typ GenericSuperClass = class1.getGenericsuperClass (); // GET -Typetype [] interfacetypes = class1.getGenericinterfaces (); // den Typ aller Schnittstellen des Klassenobjekts GetComponentType (GenericSuperClass) erhalten; getComponentType (interfacetypes [0]);
Implementierung von GetComponentType
Private Class <?> GetComponentType (Typ Typ) {class <?> componentType = null; if (TypinstanceOf parameterizedType) {// GetActualtTypearGumente () gibt ein Array von Typ -Typen zurück, die die tatsächlichen Typparameter dieses Typs darstellen. Type [] trupleTypeargumente = ((parameterizedtype) type) .getactualtTypeargumente (); if (trupleTypeargumente! = null && trupleTypeargumente.length> 0) {componentType = (Klasse <?>) trupleTypeargumente [0]; }} else if (Typinstanz von genericArrayType) {// Array -Typ, der einen Elementtyp darstellt, der ein parametrisierter Typ oder Typ variable componentType = (class <>) ist ((GenericArrayType) .getGenericComponentType (); 6.) Annotationsinformationen über den Reflexionsmechanismus erhalten
Hier konzentrieren wir uns darauf, die Annotationsinformationen der Methode als Beispiel zu erhalten
Versuchen Sie es mit {// Zunächst müssen Sie das Methodenobjekt, das dieser Methode Methode entspricht, abrufen. Annotation [] Annotationen1 = method.getannotations (); // Alle Methodenanmerkungen Informationen Annotation Annotation 1 = methode.getannotation (Routeruri.ClASS); // Erhalten Sie die angegebenen Annotationsinformationen typariable [] typariables1 = method.getTyparameters (); Annotation[][] parameterAnnotationsArray = method.getParameterAnnotations();//Get all parameter annotations information Class<?>[] parameterTypes = method.getParameterTypes();//Get all parameters class type Type[] genericParameterTypes = method.getGenericParameterTypes();//Get all parameters type type Class<?> returnType = method.getReturnType (); // den Rückgabetyp der Methode int modifikierer = method.getModifiers (); // Die Zugriffsberechtigungen der Methode} catch (NoSuchMethododException E) {E.printstacktrace ();} abrufenAnwendungsszenarien des Reflexionsmechanismus:
Vor- und Nachteile des Reflexionsmechanismus:
Vorteile: Urteil des Laufzeittyps, dynamischer Klassenbelastung und dynamischer Proxy -Reflexion.
Nachteile: Leistung ist ein Problem. Die Reflexion entspricht einer Reihe von Erklärungsoperationen. Die Leistung von JVM darüber informiert, was zu tun ist, ist viel langsamer als den direkten Java -Code.
Zusammenfassen:
Der Reflexionsmechanismus von Java wird in der täglichen Geschäftsentwicklung selten eingesetzt, wird jedoch bei der Konstruktion einiger grundlegender Rahmenbedingungen häufig verwendet. Heute habe ich kurz zusammengefasst und gelernt, und es gibt noch viele unbekannte Wissen, die später verwendet werden müssen, um es zu ergänzen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.