1

我正在尝试使用反射创建持有类的实例,但我不断收到以下异常

java.lang.ClassNotFoundException:类 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) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:306) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 在 java.lang.ClassLoader.loadClass( ClassLoader.java:247) 在 java.lang.Class.forName0(Native Method) 在 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;
    }
}

我究竟做错了什么?

4

3 回答 3

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();
于 2013-07-18T23:27:13.603 回答
3

这一行在这里:

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());
于 2013-07-18T23:27:21.590 回答
0

只使用 getClass().newInstance() 有什么问题?

于 2013-07-18T23:52:08.933 回答