English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Erklärung der Reflection in Java

Inhaltsverzeichnis

  1. Java Reflection API
  2. Durch Reflection eine Instanzobjekt erstellen
  3. Durch Reflection aufgerufene private Methoden
  4. Über das javap-Tool
  5. Referenzmaterialien

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

  1. IDE, wie Eclipse, MyEclipse, NetBeans und andere;
  2. Debugger;}
  3. Testwerkzeuge und so weiter;
  4. große Frameworks wie spring, hibernate und so weiter;

Klasse java.lang.Class

Die Klasse java.lang.Class bietet hauptsächlich folgende zwei Funktionen:

  1. Bietet Methoden zum Zugriff auf die Metadaten der Klasse während der Laufzeit;
  2. Bietet Methoden zum Überprüfen und Ändern des Laufzeitverhaltens der Klasse;

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:

  1. Die Methode forName() der Klasse Class, dynamisches Laden, während der Laufzeit, beginnt mit dem Laden der Klasse und führt die statische Initialisierung der Klasse durch
  2. Das getClass()-Objekt des Objekts, statische Ladevorgänge (bei der Kompilierung bereits geladen)
  3. .class-Syntax, statische Ladevorgänge (bei der Kompilierung bereits geladen)

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:

  1. Durch die Methode newInstance() des Class-Objekts erstellt, dieses Verfahren kann nur den Parameterlosen Konstruktor aufrufen;
  2. Durch die Methode newInstance() des Constructor-Objekts erstellt, dieses Verfahren ist geeignet für Konstruktoren mit Parametern und kann das Singleton-Muster stören, den privaten Konstruktor aufrufen;

所以,通常来讲,第二种方式比第一种使用范围更广。

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.

Dir gefällt vielleicht auch