Java 在由类名创建的反射中发现ClassNotFound异常

Java 在由类名创建的反射中发现ClassNotFound异常,java,android,reflection,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

我在使用下面的代码时遇到困难。我需要在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;
    }
}
使用反射
  • 要使用反射加载类,您需要确保所需的类在您的应用程序中可用

  • 如果您正在开发Android应用程序,则需要将外部软件包包含到应用程序库路径中

  • 要加载类,您需要指定完全限定的类名,这意味着包括包名,例如
    com.example.packageName.ClassName

关于你的问题。 因此,从您提供的日志输出中,我可以看到您试图加载类
com.harpz.htmlee.model.MUser

但是,正如错误消息所提示的,您尝试加载名为
class com…
的类

在传递的
classOfName
变量中删除前面的class(+空格)关键字

代码改进 此外,我建议您将
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
公共类选择器适配器{
公共T读取(元素、字符串类名称){
对象对象;
试一试{
Class mClass=Class.forName(classOfName);
mObject=mClass.newInstance();
字段[]fd=mClass.getDeclaredFields();
返回(T)mObject;
}catch(classnotfounde异常){
e、 printStackTrace();
}捕获(非法访问例外e){
e、 printStackTrace();
}捕获(实例化异常e){
e、 printStackTrace();
}
}
}//下课
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