Java 在由类名创建的反射中发现ClassNotFound异常
我在使用下面的代码时遇到困难。我需要在Java中通过类名反射创建对象,但编译时会抛出以下错误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
// 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