由类名创建的Reflection中的ClassNotFound异常

时间:2017-10-28 12:05:32

标签: java android reflection

我遇到以下代码的困难。我需要通过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)

1 个答案:

答案 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