Ошибка экземпляра getLeclaredField ClassLoader

Почему, когда я пытаюсь вызвать метод, я получаю:

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

Мой код:

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

Теоретически я передаю экземпляр объекта, но это не удалось.

Заранее спасибо:)

2 ответа

Решение

Вы вызываете метод getSize()используя отражение на объекте типа Field (tVGA) вместо вызова этого значения этого поля, которое имеет тип WebcamResolution,

Предполагая, что вам действительно нужно сделать это с помощью отражения, код должен быть:

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

Вы вызываете getSize метод на поле tVGA, но метод объявлен на com.github.sarxos.webcam.WebcamResolution.

Если вы хотите вызвать метод экземпляра, вы должны передать экземпляр в качестве первого аргумента метода inovke.

Если метод не принимает аргумент, как com.github.sarxos.webcam.WebcamResolution.getSize()Просто вызовите это так:

tMeth.invoke(webcamResolutionObj);

Но почему бы вам просто не использовать перечисление WebcamResolution.

 String enumName = "VGA";
 WebcamResolution wcResolution = WebcamResolution.valueOf(enumName);
 Dimension size = wcResolution.getSize();
Другие вопросы по тегам