2013-07-28 1 views
0

Pourquoi lorsque je tente d'appeler la méthode i obtenir:ClassLoader getDeclaredField exemple erreur

java.lang.IllegalArgumentException: object is not an instance of declaring class 

Mon code:

Class<?> tWCCamRes = tCLSLoader.loadClass("com.github.sarxos.webcam.WebcamResolution"); 
Field tVGA = tWCCamRes.getDeclaredField("VGA"); 

Method tMeth = tVGA.getDeclaringClass().getDeclaredMethod("getSize"); 
tMeth.invoke(tVGA, (Object[]) null); // Error 

En théorie je passe l'instance d'objet, mais il a échoué.

Merci à l'avance :)

+0

Pas besoin de mettre la langue dans le titre. La balise Java est suffisante. –

+0

Je ne savais pas, je suis désolé. –

Répondre

1

Vous appelez la méthode getSize(), en utilisant la réflexion, sur un objet de type Field (tVGA), au lieu de l'appeler sur la valeur de ce champ, qui est de type WebcamResolution.

En supposant que vous avez vraiment besoin de le faire par la réflexion, le code doit être:

Class<?> tWCCamRes = tCLSLoader.loadClass("com.github.sarxos.webcam.WebcamResolution"); 
Field tVGA = tWCCamRes.getDeclaredField("VGA"); 
Object vgaFieldValue = tVGA.get(null); // it's a static field, so the argument of get() can be null. 

Method tMeth = tVGA.getDeclaringClass().getDeclaredMethod("getSize"); 
tMeth.invoke(vgaFieldValue); 
+0

Merci beaucoup, cela fonctionne parfaitement mais pouvez-vous m'expliquer pourquoi "tVGA.get (null);" ? Je suis nouveau dans la question classloader, désolé. –

+0

'field.get (Object o)' retourne la valeur du champ pour l'objet 'o'. Mais ici, le champ est un champ statique. Il n'a donc aucun objet pour trouver la valeur du champ. La valeur du champ est dans la classe elle-même. Donc l'argument 'o' est ignoré. C'est expliqué dans le javadoc de 'Field.get()'. –

+0

C'est comme si vous obteniez l'instance de classe avec "tVGA.get (null)"? C'est juste ? Cela arrive dans tous les cas lorsque vous avez besoin d'obtenir l'instance de la classe? –

1

Vous invoquez la méthode getSize sur le terrain tVGA, mais la méthode est déclarée sur com.github.sarxos.webcam.WebcamResolution.

Si vous souhaitez appeler une méthode d'instance, vous devez passer l'instance en tant que premier argument de la méthode inovke.

Si la méthode ne prend pas d'argument comme com.github.sarxos.webcam.WebcamResolution.getSize() Juste invoquez cette façon:

tMeth.invoke(webcamResolutionObj); 

Mais pourquoi ne pas simplement utiliser la enum WebcamResolution.

String enumName = "VGA"; 
WebcamResolution wcResolution = WebcamResolution.valueOf(enumName); 
Dimension size = wcResolution.getSize(); 
+0

Voulez-vous dire ceci: tMeth.invoke (tWCCamRes); ? Il a échoué –

+0

Je ne peux pas utiliser directement la classe "WebcamResolution", car j'écris un client/serveur et je ne veux pas inclure toutes les bibliothèques dans l'application côté client pour ne pas augmenter la taille, donc l'application côté client va télécharger et utiliser le bibliothèques quand il le faut. Désolé pour mon mauvais anglais. –

+0

Aucun tWCCamRes n'est l'objet de classe. Vous avez besoin d'une instance de cette classe pour appeler la méthode d'instance, mais comme j'ai répondu ... pourquoi n'utilisez-vous pas la méthode enum valueOf? –