Der Java -Reflexionsmechanismus befindet sich im laufenden Zustand. Eine Objektmethode wird als Reflexionsmechanismus der Java -Sprache bezeichnet. Das Konzept der Reflexion wurde erstmals von Smith im Jahr 1982 vorgeschlagen, wobei sich hauptsächlich auf eine Fähigkeit bezog, auf die ein Programm auf seinen eigenen Zustand oder Verhalten zugreifen, erkennen und ändern kann. Der Vorschlag dieses Konzepts löste schnell die Forschung zum angewandten Reflexionsvermögen im Bereich der Informatik aus. Es wurde erstmals im Bereich des Programmiersprachendesigns übernommen und erreichte Erfolge in Lisp und Objektorientierter.当然反射本身并不是一个新概念,它可能会使我们联想到光学中的反射概念,尽管计算机科学赋予了反射概念新的含义,但是,从现象上来说,它们确实有某些相通之处,这些有助于我们的理解。
Der Java -Reflexionsmechanismus liefert hauptsächlich die folgenden Verwendungen:
Bestimmen Sie die Klasse, zu der ein Objekt zur Laufzeit gehört
Konstruieren Sie Objekte einer Klasse zur Laufzeit
在运行时判断任意一个类所具有的成员变量和方法
Aufrufen von Methoden eines Objekts zur Laufzeit
首先看一个简单的例子,通过这个例子来理解Java的反射机制是如何工作的。
Paket com.wanggc.reflection; Import Java.lang.reflect.Method;/*** Java Reflection -Übungen. * * @Author Wanggc * /öffentliche Klasse Fornametest { /** * Eingabefunktion. * * @param args * Parameter * @throws Exception * Fehlermeldung */ public static void main (string [] args) löst Ausnahme aus {// Klasse class Class <?> cls = class.fornam e (args [0]); / / Erhalten Sie das entsprechende Objekt über die Klassenmethode [] methods = cls.getMethods ();Wenn der übergebene Parameter Java.lang.String ist, wird das folgende Ergebnis ausgegeben
öffentlich boolean java.lang.string.equals (java.lang.object) public java.lang.string java.lang.string.tostring () public int java.lang.string.hashcode () pu blic int java.lang.string.stringing . int) public int java.lang.string.indexof (java.lang.string) public int java.lang.string.indexof (java.lang.string, int) öffentliche statische statische java.lang.string java.lang .string.valueof (int) öffentliches statisches java.lang.string java.lang.string.valueof (char) public static java.lang.string java.lang.string java.lang.string.valueof (boolean) öffentliches statisches statisches java.lang.st Ring Ring java.lang.String.valueOf( float)public static java.lang.String java.lang.String.valueOf(char[],int,int)public static java.lang.String java.lang.String.valueOf(double) Öffentliche S tatic Java.lang.String Java .lang.String.Valueof (char []) Öffentliche statische Java.lang.String Java.lang.String.Valueof (java.lang.object) Public static Java.lang.string Java. Lang.String. String.CodePointCount (int, int) public int java.lang.string.comparetoignorecase (java.lang.string) public java.lang.string java.lang.string.concat (java.lang.string) öffentlich boolean java.langa.langer .String .contains (java.lang.charsequence) öffentlich boolean java.lang.string.contentequals (java.lang.charsequence) öffentlich boolean java.lang.string.contentequals (java.lang.stringbuffer) öffentliche statia c java.lang. String Java.lang.String.CopyValueof (char []) Public static java.lang.string java.lang.string.copyValueof (char [], int, int) public boolean java.lang.string.endswith (java.lang. String) Public Boolean java.lang.string.equalsignorecase (java.lang.string) öffentliches statisches java.lang.string java.lang.string.format (java.lang.string, java.lang.object []) Öffentliche statische statische Java -Java .Lang.String Java.lang.st Ring.Format (java.util.locale, java.lang.string, java.lang.object []) public byte [] java.lang.string.getBytes (java.lang.string ) wirft java.io.unsupportedenc OddExceptionPublic void java.lang. gettbytes (java.nio.charset.char set) public void java .lang.string.getchars (int, int, char [], int) öffentlich geborener java.lang.string java.lang.string.intern () public boolean java .Lang.String.Isempty () public int j ava.lang. ) public int java.lan g.string.lastindexof (java.lang. string, int) public int java.lang.string.length () public boolean java.lang.string.matches (java.lang.string) public int java .lang.string.offsetByCodepoin ts (int, int) öffentlich boolean java.lang .string.regionMatches (boolean, int, java.lang.string, int, int, int, int) öffentlich boolean java.lang.string.regionmatches (int, int, int, int, int, int, int, int, java.lang.string, int, int) public java.lan g.string java.lang .string.replace (java.lang.charsequence, java.lang.charsequence) öffentliche Java.Lang.String Java.lang.string.replace.Replace (Char, Char) Public Java.lang.String Java .lang.String.Replaceall (Java .lang.String, Java.lang.String) Public Java.Lang.String Java.lang.String.Replacefirst (Java.lang.String.String , Java.lang.String) Public Java.lang.String [] Java.lan G.String .Split (Java.lang.String) Public Java.lang.String [] Java.lang.string.split (Java.lang. String, int) Public Boolean java.lang.string.startswith (java.lang.st Ring) öffentlicher Boolean Java.lang.String.startswith (java.lang.string, int) öffentliche java.lang.charquence java.lang.stringing .Subsequence (int, int) öffentlich java.lang.string j ava.lang.string.substring (int) public Java.lang.String Java.lang.String.Substring (int, int) öffentlich [] Java.Lang. String.tochararray () öffentlich Java.lang.String Java.Lang.String.tolow Ercase () Public Java. .String java.lang.string.touppercase () public java.lang.string java.lang.string ing.touppercase (java.util. Locala void java.lang.object.wait (long) löst Java.lang.InterruptedExceptionPub lic lc java. java.lang.interruptedExceptionPublic Final Native Java.lang.cla SS Java.lang.object.getClass () öffentliche endgültige native void java.lang.object.
Dies listet alle Methodennamen, ihre begrenzenden Zeichen, Rückgabetypen und geworfene Ausnahmen der Java.lang.String -Klasse auf. Dieses Programm verwendet die Klasse der Klasse Class Forname, um die angegebene Klasse zu laden, und ruft dann die GetMethods -Methode auf, um die Methodenliste der angegebenen Klasse zurückzugeben. Java.lang.reflect.Method wird verwendet, um eine einzelne Methode in einer bestimmten Klasse auszudrücken.
Die Verwendung von Javas Reflexionsmechanismus erfordert im Allgemeinen drei Schritte:
Rufen Sie das Klassenobjekt ab, das Sie die Klasse über das im erste Schritt erhaltene Klassenobjekt bedienen möchten, um die Methode der Klasse oder die im zweite Schritt des Betriebsnamens erhaltene Methode oder Attribut zu erhalten.
Wenn Java ausgeführt wird, entsprechen sie demselben Klassenobjekt, das die Klasse und Schnittstelle im laufenden Programm darstellt, unabhängig davon, wie viele Objekte eine bestimmte Klasse generiert. Es gibt drei gängige Möglichkeiten, Klassenobjekte der Operationsklasse zu erhalten:
Rufen Sie die statische Methode der Klasse auf, wie im obigen Beispiel gezeigt.
使用类的.class语法,如:Class<?> cls = String.class;
Rufen Sie die GetClass -Methode des Objekts auf, wie z. B. String Str = "ABC";
下面将通过实例讲述如何通过前面所诉的三步来执行某对象的某个方法:
Paket com.wanggc.reflection; * * @Author Wanggc */ public class ReflectionTest {public static void main (String [] args) Ausnahme {display display = new display (); Nehmen Sie die Anzeigenmethode der Klassenmethode durch. void show (String name) {System.out.println ("Hallo:" + Name);Wie bereits erwähnt, verfügt jede Klasse eines Java -Programms über ein Klassenobjekt, das ihm entspricht. Der erste Schritt in der Java -Reflexion besteht darin, dieses Klassenobjekt wie 14 Codezeilen zu erhalten. Natürlich muss die Methode jeder Klasse auch ein Methodenobjekt haben, das ihm entspricht. Um diese Methode durch Reflexion aufzurufen, müssen Sie zuerst das Methodenobjekt dieser Methode wie Zeile 16 des Codes erhalten und dann das Methodenobjekt verwenden, um diese Methode nacheinander zu nennen, z. B. Zeile 18 des Codes. Beachten Sie, dass der erste Parameter der GetMethod -Methode in Zeile 16 der Methodenname ist und der zweite der Parametertyp dieser Methode ist. Führen Sie die Invoke -Methode von 18 Zeilen aus, die tatsächlich die Show -Methode sind Der Parameter besteht darin, es an die Show -Methode zu übergeben. Der Typ und die Zahl müssen mit der GetMethod -Methode von 16 Zeilen übereinstimmen.
上例讲述了如何通过反射调用某个类的方法,下面将再通过一个实例讲述如何通过反射给某个类的属性赋值:
Paket com.wanggc.reflection; * * @Author Wanggc */ Public Class ReflectionTest {public static void main (String [] args) löst Ausnahme aus {// Student Object Student = New Student (); ; ) + ":" + DestStudent.getStuage ()); * * @param aus * Kopieren Sie das Quellobjekt * @param dest * das Zielobjekt * @throws Exception * Ausnahme */ private statische void CopyBean (Objekt von, Object Dest) löst Ausnahme aus {// das Klassenobjekt des Kopierens abrufen Quellobjektklasse <?> FromClass = von.getClass (); > Destclass = Dest.GetClass (); Name des Kopierobjekts Destfield = destc lass.getDeclaredfield (Name); Objekt zum entsprechenden Attribut des Kopierzielobjekts destfield.set (dest, fromField .::::::::::::::::::::::::::::::::::::::::::3 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; } } } /** * Student class. * / Class Student { / ** Name* / privat String Stuname; ** @return student name*/ public String getStuname () {return Stuname; } / *** Get Student Age** @return Student Age* / public int getstuage () {return stuage; ) { this.stuAge = stuAge; } }Im Java -Startmechanismus entspricht die Klasse der Klasse, die Klassenmethoden entsprechen der Methode, und natürlich entsprechen die Eigenschaften auch dem Feld. Die Kommentare im Code wurden ausführlich kommentiert und werden hier nicht wiederholt. Beachten Sie jedoch, dass das Feld Get- und Festlegen von Methoden zum Abnehmen und Festlegen der Werte von Attributen bietet. Da das Attribut jedoch ein privater Typ ist, muss die Zugänglichkeit des Attributs auf true eingestellt werden, wie z. B. Zeilen 50 ~ 51 der Code. Sie können auch die Barrierefreiheit für die gesamten Felder festlegen und die statische Methode von AccessibleObject setAcalable unter 40 Zeilen verwenden, wie z.
Die vorherige Beschreibung zeigt, wie der Java -Reflexionsmechanismus verwendet wird, um die Methoden und Eigenschaften einer Klasse zu bedienen.
package com.wanggc.reflection; import java.lang.reflect.Field; /** * Java 反射之属性练习。 * * @Author Wanggc */ Public Class ReflectionTest {public static void main (String [] args) löst Ausnahme aus {// Student Object Student = New Student (); ; ()); * * @param aus * Kopieren Sie das Quellobjekt * @param dest * das Zielobjekt * @throws Exception * Ausnahme */ privates statisches Objekt CopyBean (Objekt aus) löst eine Ausnahme aus {// Das Objekt der Quellobjektklasse des Quellobjekts kopieren < ?> from class = von.getClass (); (); set (ints, fromfield.get (aus)); * / Class Student { / ** Name* / privat String Stuname; ** @return student name*/ public String getStuname () {return Stuname; } / *** Get Student Age** @return Student Age* / public int getstuage () {return stuage; ) {this.stuage = stuage;Das Ergebnis dieses Beispiels und das vorherige Beispiel ist das gleiche. Das von der kopierende Methode zurückgegebene Objekt wird jedoch nicht mehr nach außen übergeben, sondern intern nach der Methode generiert, wie im Code in Zeile 40 gezeigt. HINWEIS: Die Newinstance -Methode der Klasse kann nur Klassen erstellen, die Konstruktoren ohne Parameter enthalten. wanggc ");
Zu diesem Zeitpunkt wurden die gemeinsamen Funktionen des Java -Reflexionsmechanismus (die Methode zum Aufrufen von Objekten zur Laufzeit, die Verwendung von Klassenattributen und die Erstellung von Klassenobjekten) eingeführt.
补充:在获得类的方法、属性、构造函数时,会有getXXX和getgetDeclaredXXX两种对应的方法。 Der Unterschied besteht darin, dass die ersteren Methoden und Eigenschaften mit Zugriffsrechten öffentlich zurückgeben, einschließlich derjenigen in der Elternklasse;
Der obige Inhalt ist der Java -Startmechanismus, der Ihnen vorgestellt wurde. Ich hoffe, es gefällt Ihnen.