我面对的是一个非常神秘的
java.lang.NoSuchMethodError
在下面粘贴的代码中。同样的方法,通过反射调用,按预期工作:
Widget a = getTextBoxWidget();
com.google.gwt.user.client.ui.UIObject uio = a; // Widget extends UIObject
for (java.lang.reflect.Method method : uio.getClass().getMethods()) {
if (method.getName().equals("getElement")) {
System.err.println("Method " + method.getName() + ":" +
method.getDeclaringClass().getName());
System.err.println("Modifier " +
java.lang.reflect.Modifier.toString(method.getModifiers()));
System.err.println("Parameter count: " + method.getParameterCount());
System.err.println("Parameter types: " + Arrays.asList(method.getParameterTypes()));
System.err.println("Return type: " + method.getReturnType());
try {
Object result = method.invoke(uio, new Object[0]);
System.err.println("Invocation successful: " + result);
Object result2 = method.invoke(uio, new Object[0]);
System.err.println("Invocation successful2: " + result2);
} catch (Exception e) {
System.err.println("Failed to invoke getElement: " + e);
e.printStackTrace(System.err);
}
}
}
// until here everything is good and it seems that
// we can call getElement and get the result, but...
Object result3 = uio.getElement(); // line 470, here I get java.lang.NoSuchMethodError
输出:
Method getElement:com.google.gwt.user.client.ui.UIObject
Modifier public
Invocation successful: <result here>
Invocation successful2: <result here>
Parameter count: 0
Parameter types: []
Return type: class com.google.gwt.dom.client.Element
堆栈跟踪:
java.lang.NoSuchMethodError: com.google.gwt.user.client.ui.UIObject.getElement()Lcom/google/gwt/user/client/Element;
at com.pyx4j.widgets.client.ValueBoxBase.setAriaLabel(ValueBoxBase.java:470)
可能的原因是什么?
uio.getClass().getClassLoader()
是
sun.misc.Launcher$AppClassLoader, id=151
method.getDeclaringClass().getClassLoader()
是相同的,具有相同的ID。
一起跑步
-verbose:class
显示
UIObject
从预期要加载的任何位置加载的类。里面的主要版本
UIObject.class
是52,与运行时主版本(1.8)匹配