English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Indice di lettura
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
java.lang.Class classe
La classe java.lang.Class principale fornisce due funzioni principali:
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:
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:
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.