java类创建自己的实例

时间:2013-07-18 23:19:56

标签: java

我正在尝试使用反射创建保持类的实例,但我一直得到以下异常

  

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;
    }
}

我做错了什么?

3 个答案:

答案 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()?