我使用反射来编写一个类,该类将从JSONArray jArr的元素创建对象(其类型我作为参数Base传递),并将它们添加到ArrayList objectList。一切都很顺利,直到我完成这一步:
for(int i = 0; i < jArr.length(); i++) {
objectList.add(Base.getConstructor(new Class[]{JSONObject.class}).newInstance(jArr.getJSONObject(i)));
}
在运行时我收到以下错误:
java.lang.NoSuchMethodException: <init> [class org.json.JSONObject]
从我从Google收集到的内容中,当您尝试使用不正确的参数调用构造函数时,会出现此错误,但我不确定为什么会在此处应用。
编辑:根据要求,这是完整错误:
06-15 18:35:55.245 1919-1919 / com.example.ben.phptest W / System.err:java.lang.NoSuchMethodException:[class org.json.JSONObject]
06-15 18:35:55.245 1919-1919 / com.example.ben.phptest W / System.err:at java.lang.Class.getConstructorOrMethod(Class.java:472)
06-15 18:35:55.255 1919-1919 / com.example.ben.phptest W / System.err:at java.lang.Class.getConstructor(Class.java:446)
06-15 18:35:55.255 1919-1919 / com.example.ben.phptest W / System.err:at com.example.ben.phptest.PHPList。(PHPList.java:58)
06-15 18:35:55.255 1919-1919 / com.example.ben.phptest W / System.err:at com.example.ben.phptest.MainActivity.onCreate(MainActivity.java:35)
06-15 18:35:55.255 1919-1919 / com.example.ben.phptest W / System.err:at android.app.Activity.performCreate(Activity.java:5231)
06-15 18:35:55.255 1919-1919 / com.example.ben.phptest W / System.err:at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
06-15 18:35:55.255 1919-1919 / com.example.ben.phptest W / System.err:at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
06-15 18:35:55.255 1919-1919 / com.example.ben.phptest W / System.err:at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
06-15 18:35:55.255 1919-1919 / com.example.ben.phptest W / System.err:at android.app.ActivityThread.access $ 800(ActivityThread.java:135)
06-15 18:35:55.255 1919-1919 / com.example.ben.phptest W / System.err:at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1196)
06-15 18:35:55.265 1919-1919 / com.example.ben.phptest W / System.err:at android.os.Handler.dispatchMessage(Handler.java:102)
06-15 18:35:55.265 1919-1919 / com.example.ben.phptest W / System.err:at android.os.Looper.loop(Looper.java:136)
06-15 18:35:55.265 1919-1919 / com.example.ben.phptest W / System.err:在android.app.ActivityThread.main(ActivityThread.java:5017)
06-15 18:35:55.265 1919-1919 / com.example.ben.phptest W / System.err:at java.lang.reflect.Method.invokeNative(Native Method)
06-15 18:35:55.265 1919-1919 / com.example.ben.phptest W / System.err:at java.lang.reflect.Method.invoke(Method.java:515)
06-15 18:35:55.265 1919-1919 / com.example.ben.phptest W / System.err:at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)
06-15 18:35:55.265 1919-1919 / com.example.ben.phptest W / System.err:at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
06-15 18:35:55.265 1919-1919 / com.example.ben.phptest W / System.err:at dalvik.system.NativeStart.main(Native Method)
(第58行是上面循环的核心)
作为旁注,我传递的类绝对接受JSONObject作为唯一的构造函数参数:
Person(JSONObject obj) throws JSONException
答案 0 :(得分:0)
如果我理解正确,你有一个正在添加的对象列表,你通过在jArr中反复调用JSONObject上的构造函数来实现这一点。 NoSuchMethodException是一个运行时异常,当您尝试在运行时调用某个方法时,该方法不存在,或者您的方法签名错误。我最好的猜测是你试图调用的构造函数没有采用JSONObject类型的参数。 newInstance方法应该使用与构造函数相同的参数列表。
答案 1 :(得分:0)
我认为您已经回答了自己的问题。没有JSONObject
构造函数只需要JSONObject
。错误正是这么说的。
为什么不将代码更改为:
for (int i = 0; i < jArr.length(); i++) {
objectList.add(jArr.getJSONObject(i));
}