2010-09-10 15 views
4

Comment appeler la méthode d'un objet qui a déjà été chargé dans la JVM en utilisant la réflexion? J'ai essayéjava méthodes d'appel par réflexion d'un objet déjà chargé

Class myClass = Class.forName("myClass"); 
Method m = com.test.class.getDeclaredMethod("getValue",new Class[] {}); 
Object result = m.invoke(myClass,null); 

mais je reçois java.lang.IllegalArgumentException: objet n'est pas une instance de déclarer classe. La méthode que je veux appeler est vide à savoir ne prend pas de paramètres

MISE À JOUR J'ai une application qui a déjà chargé une classe « A ». Une autre classe "B" sera instanciée par un framework. Lorsque la classe "B" est initialisée, la classe "A" a déjà été chargée dans la JVM. Je veux appeler une méthode de instance chargée de la classe "A" MAIS sans avoir une référence à "A" dans la classe "B". Dans les réponses, il semble que je doive créer une nouvelle instance de "A" dans la classe "B" mais je veux accéder à un objet déjà chargé. Si je crée une nouvelle instance de "A" dans "B", pourquoi voudrais-je utiliser la réflexion? Est-ce que je ne comprends pas quelque chose?

Merci

+0

Quel est l'objet "déjà chargé" - et comment l'avez-vous "chargé"? –

+0

La réflexion consiste à rechercher des informations sur un objet, sans trouver un objet en mémoire. Donc, si vous voulez qu'une instance de la classe B ait accès à une instance de la classe A, vous devrez lui donner un contrôle. – aperkins

+0

@ user384706, c'est juste une supposition sauvage, mais peut-être que la méthode que vous voulez invoquer devrait être une méthode statique (de classe), plutôt qu'une méthode d'instance? En outre, dans votre mise à jour, vous semblez utiliser inconsciemment "class" et "instance". Ce que vous décrivez n'a pas beaucoup de sens pour moi. – Ladlestein

Répondre

11

vous passez l'instance de classe comme premier paramètre à Method.invoke(..), mais ce qui ne va pas; vous voulez passer l'instance que vous êtes intéressé par

result = m.invoke(myInstance, null); 
+0

Comment puis-je trouver myInstance? Il a déjà été chargé dans JVM et n'y a pas accès depuis cette classe. – Cratylus

+1

@user: Vous devez avoir accès à l'instance pour y invoquer quelque chose - vous devez le passer ou en obtenir une référence de quelque part . – aperkins

+0

Si j'ai une référence à l'objet, pourquoi aurais-je besoin d'utiliser la réflexion? Je veux appeler une méthode d'un objet qui est déjà chargé dans JVM à partir d'un autre objet sans avoir de référence – Cratylus

2

Au lieu de:.

Object result = m.invoke(myClass, null); 

Vous devriez être de passage dans un exemple de myClass. L'exception de l'argument illégal est dû invoquer obtenir un argument de type classe au lieu du type myClass:

Object result = m.invoke(myInstance, null); 
4

Je pense que vous avez besoin

Class myClass = myObject.GetClass(); 
Method m = com.test.class.getDeclaredMethod("getValue",new Class[] {}); 
Object result = m.invoke(myObject,null); 
0

La chose au sujet invoke, est que vous ne devez pas avoir la instance exacte de la classe en question, si la méthode appelée ne nécessite aucune variable d'instance de la classe parente. En fait, vous pouvez ajouter le modificateur static au Method et il suffit d'appeler invoquer avec null, null, Object[] qui est le même que:

public void methLab(Method m){ 
    try{ 
    m.invoke(m.getDeclaringClass().newInstance(), new Object[0]); 
    }catch(IllegalAccessException iae){ 
    // The method or parent class is declared private or protected 
    }catch(IllegalArgumentException iae){ 
    // unsatisfied input parameters (in this case, no params were passed) 
    }catch(InstantiationException ie){ 
    // could be several things 
    }catch(InvocationTargetException it){ 
    // Method specific, exception chain. call: it.getTargetException(). 
    } 
} 
1

Si je référence à l'objet, pourquoi aurais-je besoin d'utiliser la réflexion? Je souhaite appeler une méthode d'un objet déjà chargé dans JVM à partir d'un autre objet sans avoir de référence.

Bien sûr, vous avez besoin d'une référence à invoquer une méthode, vous pouvez l'utiliser comme:

Object result = m.invoke(myClass.newInstance(),null); 

Mais la période de vie de l'instance compte en fonction de la façon dont vous créez (normalement ou par réflexion).

0

i ont le même problème, et qui le savent, est très simple, si u sur la classe même endroit que tu veux appeler, faire:

Object result = m.invoke(this, null); 

avec ce u passera l'instance selfie et ne perdez pas vos valeurs.