【问题标题】:ClassLoader getDeclaredField instance errorClassLoader getDeclaredField 实例错误
【发布时间】:2013-07-28 08:59:46
【问题描述】:

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

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

理论上我传递了对象实例但它失败了。

提前致谢:)

【问题讨论】:

  • 不需要在标题中加上语言。 Java标签就足够了。
  • 我不知道,对不起。

标签: java classloader instance getmethod


【解决方案1】:

您在 Field (tVGA) 类型的对象上使用反射调用方法 getSize(),而不是在该字段的 上调用它,即类型为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);

【讨论】:

  • 非常感谢,它工作得很好,但你能解释一下为什么“tVGA.get(null);” ?我是类加载器问题的新手,抱歉。
  • field.get(Object o) 返回对象 o 的字段值。但是在这里,该字段是一个静态字段。所以它没有任何对象可以在其中找到字段的值。字段值在类本身中。所以o 参数被忽略。在Field.get()的javadoc中有解释。
  • 这就像你用 "tVGA.get(null)" 获得类的实例?这是正确的 ?当您需要获取类的实例时,这在所有情况下都会发生?
  • 我们举一个更简单的例子。您有一个带有字段 nameEmployee 类。您有两个 Employee 实例:johnmary。您想使用反射获得玛丽的名字。因此,您从类Employee 中获得了字段“名称”。然后你要求这个字段告诉它在对象mary 中的值是什么。这将返回“玛丽”。这里,该字段是一个静态字段。它的值在类本身中,而不是在类的实例中。所以你不需要将任何实例传递给get() 方法。 tVGA.get(null) 等同于 WebcamResolution.VGA,没有反射。
  • 现在我明白了。很清楚的解释!非常感谢 :)
【解决方案2】:

您在字段 tVGA 上调用 getSize 方法,但该方法是在 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();

【讨论】:

  • 你是说这个吗:tMeth.invoke(tWCCamRes); ?失败了
  • 我不能直接使用“WebcamResolution”类,因为我正在编写客户端/服务器,我不想在客户端应用程序中包含所有库以不增加大小,所以客户端应用程序将在需要时下载和使用这些库。对不起我的英语不好。
  • 没有 tWCCamRes 是类对象。您需要该类的实例来调用实例方法,但就像我回答的那样.. 为什么不使用枚举 valueOf 方法?
  • 我看了看图书馆。它只有382k。如果不能将此库添加到客户端应用程序,则必须有非常严格的内存要求。
  • 还有5个库:bridj-0.6.3-20130316.190111-13.jar dx-1.7.jar logback-core-1.0.13.jar slf4j-api-1.7.2.jar slf4j- nop-1.7.5.jar
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 2018-08-09
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 2012-03-30
相关资源
最近更新 更多