English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Inhaltsverzeichnis
Java Reflection API
Java ReflectionBezieht sich auf den Prozess, die Eigenschaften und Methoden der Klasse während des Laufzustands abzurufen oder das Verhalten der Klasse während der Laufzeit zu ändern.
Klasse java.lang.ClassEs werden viele Methoden bereitgestellt, um Metadaten zu erhalten, das Verhalten der Klasse während der Laufzeit zu überprüfen und zu ändern.
Java Reflection betrifft hauptsächlich die Klassen in den Paketen java.lang und java.lang.reflect.
Beispiele für Anwendungsszenarien der Reflection
Klasse java.lang.Class
Die Klasse java.lang.Class bietet hauptsächlich folgende zwei Funktionen:
Häufig verwendete Methoden der Klasse java.lang.Class
Methode | Beschreibung |
---|---|
1) public String getName() | Gibt den Klassennamen zurück |
2) public static Class forName(String className)throws ClassNotFoundException | Lädt die Klasse und gibt das Class-Objekt zurück |
3) public Object newInstance()throws InstantiationException,IllegalAccessException | Erstellt ein Instanzobjekt |
4) public boolean isInterface() | Prüft, ob es sich um eine Schnittstelle handelt |
5) public boolean isArray() | Prüft, ob es sich um ein Array handelt |
6) public boolean isPrimitive() | Prüft, ob es sich um einen ursprünglichen Datentyp handelt |
7) public Class getSuperclass() | Gibt den Class-Verweis der Oberklasse zurück |
8) public Field[] getDeclaredFields()throws SecurityException | Gibt das Feld-Array der Klasse zurück |
9) public Method[] getDeclaredMethods()throws SecurityException | Gibt das Methoden-Array der Klasse zurück |
10) public Constructor[] getDeclaredConstructors()throws SecurityException | Gibt das Konstruktoren-Array der Klasse zurück |
11) public Method getDeclaredMethod(String name,Class[] parameterTypes)throws NoSuchMethodException,SecurityException | Gibt die Methode zurück, die den angegebenen Parameter-Typ im Klassenummer enthält |
Wie man das Class-Objekt erhält
Es gibt drei Möglichkeiten, wie folgt:
Beispiel der forName() Methode
Kann für dynamische Ladevorgänge verwendet werden, wenn Sie den vollständigen Namen der Klasse kennen. Beachten Sie, dass der ursprüngliche Datentyp nicht mit diesem Verfahren verwendet werden kann;
package tmp; class Simple { } public class Test { public static void main(String args[]) throws ClassNotFoundException { try63Class< System.out.println(c.getName()); System.out.println(c.getSimpleName()); } }
tmp.Simple Simple
Beispiel der getClass() Methode:
Den Class-Objekt aus dem Instanzobjekt abrufen
package tmp; class Simple { } public class Test { void printName(Object obj) { } public static void main(String args[]) { Simple s = new Simple(); try63; extends Object> c = s.getClass(); System.out.println(c.getName()); System.out.println(c.getSimpleName()); } }
tmp.Simple Simple
Beispiel der .class-Syntax
Wird auf den Klassennamen angewendet und kann auch auf die ursprünglichen Datentypen angewendet werden, wie folgt:
package tmp; public class Test { public static void main(String args[]) { Class<Boolean> c = boolean.class; System.out.println(c.getName()); Class<Test> c2 = Test.class; System.out.println(c2); } }
boolean tmp.Test
Bestimmen Sie den Typ des Class-Objekts
Nachfolgende Methoden können verwendet werden, um den Typ des Class-Objekts zu bestimmen:
1); Ob es einer Schnittstelle entspricht |
2); Ob es einem Array entspricht |
3); Ob es dem ursprünglichen Datentyp entspricht |
Beispielcode:
package tmp; class Simple { } interface My { } public class Test { public static void main(String args[]) { this.msg = s; { try63Class< System.out.println(c.isInterface()); try63;> c2 = Class.forName("tmp.My"); System.out.println(c2); } catch (Exception e) { System.out.println(e); } } }
false true
Durch Reflection eine Instanzobjekt erstellen
Es gibt zwei Methoden, wie folgt:
所以,通常来讲,第二种方式比第一种使用范围更广。
Also, im Allgemeinen ist der zweite Weg im Vergleich zum ersten weiter verbreitet in seiner Verwendung.}
package tmp; class Simple { private String msg; { Beispiel für die Verwendung der newInstance()-Methode eines Class-Objekts } } public class Test { public static void main(String args[]) { this.msg = s; { try63Class< System.out.println("Hello Java"); s.message(); } catch (Exception e) { System.out.println(e); } } }
Simple s = (Simple) c.newInstance();
Hello Java
Beispiel für die Verwendung der newInstance()-Methode eines Constructor-Objekts
package tmp; Beachtet, dass hier die spezifische Konstruktormethode basierend auf dem Typ des übergebenen Parameters erhalten werden kann, und die Zugriffsrechte der Konstruktormethode geändert werden können. class Simple { import java.lang.reflect.Constructor; private String msg; { void message() + System.out.println("Hello Java," } msg); private Simple(String s){ } } public class Test { public static void main(String args[]) { this.msg = s; { try63Class< ;> c = Class.forName("tmp.Simple");63;> con = c.getDeclaredConstructor(String.class); con.setAccessible(true); Simple s = (Simple) con.newInstance("..."); s.message(); } catch (Exception e) { System.out.println(e); } } }
Hello Java,...
Durch Reflection aufgerufene private Methoden
Durch Reflection können wir private Methoden anderer Klassen aufrufen, was hauptsächlich die Klassen java.lang.Class und java.lang.reflect.Method betrifft;
Dabei wird hauptsächlich die Methode setAccessible der Klasse Method und die Methode invoke verwendet, die前者修改访问权限,后者调用方法。
Durch Aufruf eines Beispiels eines privaten mit Parameter versehenen Methoden:
package tmp; import java.lang.reflect.Method; class A { private void cube(int n) { System.out.println(n * n * n); } } class Test { public static void main(String args[]) throws Exception { Class<A> c = A.class; Object obj = c.newInstance(); Method m = c.getDeclaredMethod("cube", new Class[]{ int.class }); m.setAccessible(true); m.invoke(obj, 4); } }
Über das javap-Tool
Mit dem javap-Befehl können Sie Java Bytecode-Dateien deassemblieren und die Feldattribute, Konstruktoren und Methodeninformationen im Class-Datei anzeigen;
Anleitung zur Verwendung:
javap Beispiel java.lang.Object
javap -c Test Beispiel:
Schreiben Sie eine einfache Test-Klasse wie folgt:
package tmp; class Simple { } public class Test { public static void main(String args[]) { System.out.println("Hello"); } }
Geben Sie javap ein -c Test:
Referenzmaterialien
Größtenteils Übersetzung, mit kleinen Änderungen
http://www.javatpoint.com/java-Reflexion
Das ist der gesamte Inhalt dieses Artikels. Ich hoffe, dieser Artikel kann Ihnen bei Ihrem Lernen oder Ihrer Arbeit ein gewisses Maß an Hilfe bieten und ich hoffe auch, dass Sie die Anleitung von呐喊 mehr unterstützen!
Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet entnommen und gehört dem jeweiligen Urheber. Der Inhalt wurde von Internetnutzern freiwillig bereitgestellt und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt keine rechtlichen Verantwortlichkeiten. Wenn Sie Inhalte mit fraglichen Urheberrechten finden, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3codebox.com (Bitte ersetzen Sie # durch @, wenn Sie eine E-Mail senden, um zu melden, und fügen Sie relevante Beweise bei. Bei nachgewiesener Infringement wird dieser Inhalt sofort gelöscht.