0

为什么当我尝试调用我得到的方法时:

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

理论上我通过了对象实例但它失败了。

提前致谢 :)

4

2 回答 2

1

getSize您在 field 上调用该方法tVGA,但该方法是在 com.github.sarxos.webcam.WebcamResolution 上声明的。

如果要调用实例方法,则必须将该实例作为 inovke 方法的第一个参数传递。

如果该方法不接受像com.github.sarxos.webcam.WebcamResolution.getSize() Just invoke it 这种方式这样的参数:

tMeth.invoke(webcamResolutionObj);

但是你为什么不直接使用 WebcamResolution 枚举。

 String enumName = "VGA";
 WebcamResolution wcResolution = WebcamResolution.valueOf(enumName);
 Dimension size = wcResolution.getSize();
于 2013-07-28T14:48:51.293 回答
1

您是在( )getSize()类型的对象上使用反射调用方法,而不是在类型为 的该字段的上调用它。FieldtVGAWebcamResolution

假设你真的需要通过反射来做到这一点,代码应该是:

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);
于 2013-07-28T15:01:56.880 回答