我遇到以下代码的困难。我需要通过Java中的类名反射来创建对象,但是在编译时它会抛出错误。
// Class where package name with class is coming
public class PickAdapter<T> {
Object mObject;
public T read(Element element, String classOfName) {
try {
Class mClass = Class.forName(classOfName);
mObject = mClass.newInstance();
Field[] fd = mClass.getDeclaredFields();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
return (T) mObject;
}
}
Logcat出错:
10-28 17:12:54.619 20743-20743/com.harpz.htmlee D/NetworkSecurityConfig: No Network Security Config specified, using platform default
10-28 17:12:55.771 20743-20743/com.harpz.htmlee W/System.err: java.lang.ClassNotFoundException: Invalid name: class com.harpz.htmlee.model.MUser
10-28 17:12:55.771 20743-20743/com.harpz.htmlee W/System.err: at java.lang.Class.classForName(Native Method)
10-28 17:12:55.771 20743-20743/com.harpz.htmlee W/System.err: at java.lang.Class.forName(Class.java:400)
10-28 17:12:55.771 20743-20743/com.harpz.htmlee W/System.err: at java.lang.Class.forName(Class.java:326)
10-28 17:12:55.772 20743-20743/com.harpz.htmlee W/System.err: at com.harpz.htmleetim.reflection.PickAdapter.read(PickAdapter.java:22)
10-28 17:12:55.772 20743-20743/com.harpz.htmlee W/System.err: at com.harpz.htmleetim.Htmlee.fromHtml(Htmlee.java:25)
10-28 17:12:55.772 20743-20743/com.harpz.htmlee W/System.err: at com.harpz.htmleetim.Htmlee.fromHtml(Htmlee.java:19)
10-28 17:12:55.772 20743-20743/com.harpz.htmlee W/System.err: at com.harpz.htmleetim.Htmlee.fromHtml(Htmlee.java:13)
10-28 17:12:55.772 20743-20743/com.harpz.htmlee W/System.err: at com.harpz.htmlee.MainActivity.onCreate(MainActivity.java:40)
10-28 17:12:55.772 20743-20743/com.harpz.htmlee W/System.err: at android.app.Activity.performCreate(Activity.java:6679)
10-28 17:12:55.772 20743-20743/com.harpz.htmlee W/System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
10-28 17:12:55.772 20743-20743/com.harpz.htmlee W/System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
10-28 17:12:55.772 20743-20743/com.harpz.htmlee W/System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
10-28 17:12:55.772 20743-20743/com.harpz.htmlee W/System.err: at android.app.ActivityThread.-wrap12(ActivityThread.java)
10-28 17:12:55.772 20743-20743/com.harpz.htmlee W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
10-28 17:12:55.772 20743-20743/com.harpz.htmlee W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
10-28 17:12:55.772 20743-20743/com.harpz.htmlee W/System.err: at android.os.Looper.loop(Looper.java:154)
10-28 17:12:55.772 20743-20743/com.harpz.htmlee W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6119)
10-28 17:12:55.772 20743-20743/com.harpz.htmlee W/System.err: at java.lang.reflect.Method.invoke(Native Method)
10-28 17:12:55.772 20743-20743/com.harpz.htmlee W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
10-28 17:12:55.772 20743-20743/com.harpz.htmlee W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
答案 0 :(得分:1)
要使用反射加载课程,您需要确保所需课程在Classpath中可用。
如果您正在开发Android-App,则需要在应用程序库路径中包含外部程序包。
要加载类,您需要指定完全限定的类名,这意味着包括包名,例如com.example.packageName.ClassName
因此,根据您提供的日志输出,我可以看到您尝试加载课程com.harpz.htmlee.model.MUser
但是,正如错误消息所示,您尝试加载名为class com...
的类。
在传递的classOfName
变量中删除前面的类(+空格)关键字。
此外,我建议您将mObject
属性更改为read
方法中的区域设置变量,因为您的用法(基于您给定的代码段)仅在此方法中。
此外,return
语句应位于try
- 块内,因为如果出现任何异常,它将永远无法到达。
所以代码改进看起来像这样:
public class PickAdapter<T> {
public T read(Element element, String classOfName) {
Object mObject;
try {
Class mClass = Class.forName(classOfName);
mObject = mClass.newInstance();
Field[] fd = mClass.getDeclaredFields();
return (T) mObject;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
} // end of class