我正在尝试使用反射创建保持类的实例,但我一直得到以下异常
java.lang.ClassNotFoundException:class com.myproject.fresh.stubClasses.TestModel at java.net.URLClassLoader $ 1.run(URLClassLoader.java:202)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(URLClassLoader.java:190)at java.lang.ClassLoader.loadClass(ClassLoader.java:306)at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:301)at at java.lang.ClassLoader.loadClass(ClassLoader.java:247)at java.lang.Class.forName0(Native Method)at java.lang.Class.forName(Class.java:171)
public class TestModel extends Model {
@Override
public Schema getSchema() {
return schema;
}
public TestModel newModel(){
TestModel model = null;
try{
Class<?> clazz = Class.forName(getClass().toString());
Constructor<?> ctor = clazz.getConstructor();
model = (TestModel) ctor.newInstance();
} catch (Exception e){
e.printStackTrace();
}
return model;
}
}
我做错了什么?
答案 0 :(得分:3)
问题是getClass().toString()
返回(例如)class com.myproject.fresh.stubClasses.TestModel
,开头有一个迷路class
。如果您使用getName()
代替它,它应该有效:
Class<?> clazz = Class.forName(getClass().getName());
虽然这是“真正的”代码(而不仅仅是计算填充代码),但更容易写出来:
Class<?> clazz = getClass();
这也可以让你更好地利用泛型:
Class<? extends TestModel> clazz = getClass();
Constructor<? extends TestModel> ctor = clazz.getConstructor();
model = ctor.newInstance();
或:
return getClass().getConstructor().newInstance();
答案 1 :(得分:2)
这一行:
Class<?> clazz = Class.forName(getClass().toString());
错了。
不要使用toString()
方法获取类的名称。请改用getName()
。
以下示例描述了它们之间的区别:
public class Test
{
public static void main(String[] args)
{
System.out.println(Test.class.toString()); //prints "class <package>.Test"
System.out.println(Test.class.getName()); //prints "<package>.Test"
}
}
类名前面的无关“类”文本抛弃'forName'方法。
最后,这就是该行的样子:
Class<?> clazz = Class.forName(getClass().getName());
答案 2 :(得分:0)
使用getClass()有什么问题.newInstance()?