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

Spiegazione dettagliata della reflection in Java

Indice di lettura

  1. API di reflection Java
  2. Creare un'istanza di oggetto tramite reflection
  3. Chiamata a un metodo privato tramite reflection
  4. Riguardo allo strumento javap
  5. Riferimenti

API di reflection Java

Reflection JavaSi riferisce al processo di ottenere le proprietà e i metodi della classe o di modificare il comportamento della classe durante l'esecuzione in stato di esecuzione.

java.lang.Class classeFornisce molti metodi per ottenere metadati, controllare e modificare il comportamento della classe durante l'esecuzione.

La reflection in Java riguarda principalmente le classi presenti nei pacchetti java.lang e java.lang.reflect.

Esempi di scenari di applicazione di reflection

  1. IDE come Eclipse, MyEclipse, NetBeans, ecc.
  2. Strumenti di debug
  3. Strumenti di test, ecc.
  4. Varios framework, come Spring, Hibernate, ecc.

java.lang.Class classe

La classe java.lang.Class principale fornisce due funzioni principali:

  1. Fornisce metodi per accedere ai metadati della classe durante l'esecuzione;
  2. Fornisce metodi per controllare e modificare il comportamento in esecuzione della classe;

Metodi comuni della classe java.lang.Class

Method Descrizione
1) public String getName() Restituisce il nome della classe
2) public static Class forName(String className) throws ClassNotFoundException Carica la classe e restituisce l'oggetto Class
3) public Object newInstance() throws InstantiationException,IllegalAccessException Crea l'oggettoistanza
4) public boolean isInterface() Determina se è un'interfaccia
5) public boolean isArray() Determina se è un array
6) public boolean isPrimitive() Determina se è un tipo di dati primitivi
7) public Class getSuperclass() Restituisce il riferimento Class del padre
8) public Field[] getDeclaredFields() throws SecurityException Restituisce l'array dei campi membro della classe
9) public Method[] getDeclaredMethods() throws SecurityException Restituisce l'array dei metodi della classe
10) public Constructor[] getDeclaredConstructors() throws SecurityException Restituisce l'array dei metodi della classe
11) public Method getDeclaredMethod(String name,Class[] parameterTypes) throws NoSuchMethodException,SecurityException Restituisce il metodo specificato dal tipo di parametro della classe

Come ottenere l'oggetto Class

Ci sono tre modi, come segue:

  1. Il metodo forName() della classe Class, caricamento dinamico, durante l'esecuzione, inizia a caricare la classe e eseguire l'inizializzazione statica della classe
  2. Il metodo getClass() dell'oggetto, caricamento statico (caricato durante la compilazione)
  3. Sintassi .class, caricamento statico (già caricato alla compilazione)}

Esempio del metodo forName():

Può essere utilizzato per caricare dinamicamente, quando si conosce il nome completo della classe. Attenzione: i tipi di dati primitivi non sono adatti per questo metodo;

package tmp;
class Simple
{
}
public class Test
{
 public static void main(String args[]) throws ClassNotFoundException
 {
 Class<?> c = Class.forName("tmp.Simple");
 System.out.println(c.getName());
 System.out.println(c.getSimpleName());
 }
}
tmp.Simple
Simple

Esempio del metodo getClass():

Ottieni l'oggetto Class dall'oggetto di istanza

package tmp;
class Simple
{
}
public class Test
{
 void printName(Object obj)
 {
 }
 public static void main(String args[])
 {
 Simple s = new Simple();
 Class<? extends Object> c = s.getClass();
 System.out.println(c.getName());
 System.out.println(c.getSimpleName());
 }
}
tmp.Simple
Simple

Esempio di sintassi .class

Agisce sul nome della classe, può anche essere applicato ai tipi di dati primitivi, come segue:

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.getName());
 }
}
boolean
tmp.Test

Determinare il tipo dell'oggetto Class

Metodi che possono essere utilizzati per determinare il tipo dell'oggetto Class:

1) public boolean isInterface(): Corrisponde a un'interfaccia?
2) public boolean isArray(): Corrisponde a un array?
3) public boolean isPrimitive(): Corrisponde al tipo di dati originale?

Esempio di codice:

package tmp;
class Simple
{
}
interface My
{
}
public class Test
{
 public static void main(String args[])
 {
 try
 {
 Class<?> c = Class.forName("tmp.Simple");
 System.out.println(c.isInterface());
 Class<?> c2 = Class.forName("tmp.My");
 System.out.println(c2.isInterface());
 }
 catch (Exception e)
 {
 System.out.println(e);
 }
 }
}
false
true

Creare un'istanza di oggetto tramite reflection

Ci sono due modi, come segue:

  1. Creato tramite il metodo newInstance() dell'oggetto Class, questo metodo può chiamare solo il costruttore senza parametri;
  2. Creato tramite il metodo newInstance() dell'oggetto Constructor, questo metodo è adatto per i costruttori con parametri e può rompere il modello singleton, chiamando il costruttore privato;

Quindi, in generale, il secondo metodo è più ampio nell'uso rispetto al primo.

Esempio di chiamata al metodo newInstance() dell'oggetto Class

package tmp;
class Simple
{
 void message()
 {
 System.out.println("Hello Java");
 }
}
public class Test
{
 public static void main(String args[])
 {
 try
 {
 Class<?> c = Class.forName("tmp.Simple");
 Simple s = (Simple) c.newInstance();
 s.message();
 }
 catch (Exception e)
 {
 System.out.println(e);
 }
 }
}

Hello Java

Esempio di chiamata al metodo newInstance() dell'oggetto Constructor

Attenzione: è possibile ottenere il costruttore specifico in base al tipo dei parametri passati e modificare i limiti di accesso al costruttore.

package tmp;
import java.lang.reflect.Constructor;
class Simple
{
 private String msg;
 void message()
 {
 System.out.println("Hello Java," + msg);
 }
 private Simple(String s){
 this.msg = s;
 }
}
public class Test
{
 public static void main(String args[])
 {
 try
 {
 Class<?> c = Class.forName("tmp.Simple");
 Constructor<?> con = c.getDeclaredConstructor(String.class);
 con.setAccessible(true);
 Simple s = (Simple) con.newInstance("...");
 s.message();
 }
 catch (Exception e)
 {
 System.out.println(e);
 }
 }
}

Hello Java,...

Chiamata a un metodo privato tramite reflection

Tramite la reflection, possiamo chiamare metodi privati di altre classi, principalmente le classi java.lang.Class e java.lang.reflect.Method;

In questo caso, si utilizzano principalmente i metodi setAccessible e invoke della classe Method, il primo modifica i permessi di accesso, il secondo chiama il metodo.

Esempio di chiamata a un metodo privato con parametri:

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);
 }
}

Riguardo allo strumento javap

Il comando javap può disassemblare i file bytecode Java, mostrando le informazioni sui campi, i metodi costruttivi e i metodi comuni del file class;

Istruzioni per l'uso:

Esempio javap java.lang.Object:

Esempio javap -c Test:

Scrivi una semplice classe Test come segue:

package tmp;
class Simple
{
}
public class Test
{
 public static void main(String args[])
 {
 System.out.println("Hello");
 }
}

Inserisci javap -c Test:

Riferimenti

Praticamente una traduzione, con alcune modifiche minime

http://www.javatpoint.com/java-reflection

Questo è tutto il contenuto dell'articolo, speriamo che il contenuto di questo articolo possa essere di qualche aiuto per il tuo studio o lavoro, e speriamo di ricevere più supporto per il tutorial URLA!

Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il diritto d'autore è di proprietà del rispettivo proprietario, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato elaborato manualmente e non assume responsabilità per le relative responsabilità legali. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito rimuoverà immediatamente il contenuto sospetto di violazione del copyright.

Ti potrebbe interessare