Ошибка экземпляра 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();