1

リフレクションを使用して保持クラスのインスタンスを作成しようとしていますが、次の例外が引き続き発生します

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) で 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(ネイティブ メソッド) で 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 に答える