2010-03-09 24 views

risposta

15

Ecco un semplice esempio di invocazione di un metodo utilizzando la riflessione che coinvolge i primitivi.

import java.lang.reflect.*; 

public class ReflectionExample { 
    public int test(int i) { 
     return i + 1; 
    } 
    public static void main(String args[]) throws Exception { 
     Method testMethod = ReflectionExample.class.getMethod("test", int.class); 
     int result = (Integer) testMethod.invoke(new ReflectionExample(), 100); 
     System.out.println(result); // 101 
    } 
} 

a essere sostenuta, si dovrebbe catturare e gestire tutte le eccezioni di riflessione legati controllato NoSuchMethodException, IllegalAccessException, InvocationTargetException.

+0

@ polygenelubrificanti-grazie – Steven

0

È possibile utilizzare getClass in qualsiasi oggetto per scoprirne la classe. Quindi è possibile utilizzare getMethods per scoprire tutti i metodi disponibili. Una volta che hai il metodo corretto è possibile chiamare invoke con qualsiasi numero di parametri

+0

eventuali collegamenti che mostrano l'esempio – Steven

0

questo è il modo più semplice che conosco, ha bisogno di essere circondato da provare & cattura:

Metodo m = .class.getDeclaredMethod ("", arg_1.class, arg_2.class, ... arg_n.class); result =() m.invoke (null, (Object) arg_1, (Object) arg_2 ... (Object) arg_n);

Questo è per invocare un metodo statico, se si desidera richiamare un metodo non statico, è necessario sostituire il primo argomento di m.invoke() da null all'oggetto da cui viene invocato il metodo sottostante.

non dimenticare di aggiungere un'importazione a java.lang.reflect. *;

+0

cosa succede se sto utilizzando le primitive – Steven

+0

@Shuky: perché trasmettere gli argomenti a Object? –

+0

@Seteven, Carlos Heuberger: il casting non è richiesto, volevo solo dire che non possono essere primitive (invece di int, usare Integer, ecc.) –

3

Per chiamare un metodo di classe utilizzando la riflessione è molto semplice. È necessario creare una classe e generare un metodo al suo interno. come segue

package reflectionpackage; 

public class My { 
    public My() { 
    } 

    public void myReflectionMethod() { 
     System.out.println("My Reflection Method called"); 
    } 
} 

e chiamare questo metodo in un'altra classe utilizzando la riflessione.

package reflectionpackage; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

public class ReflectionClass { 

    public static void main(String[] args) 
    throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { 
     Class c=Class.forName("reflectionpackage.My"); 
     Method m=c.getDeclaredMethod("myReflectionMethod"); 
     Object t = c.newInstance(); 
     Object o= m.invoke(t);  
    } 
} 

Find more details here.

Problemi correlati