3

こんにちは、リフレクションを使用して内部クラスのオブジェクトを取得したいのですが、エラーが発生しています。

コードは次のとおりです:-

package reflaction;
public class MyReflection {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException  {
    Class obj = Class.forName("reflaction.MyReflection$TestReflection");
    TestReflection a = (TestReflection) obj.newInstance();
    a.demo();
}

class TestReflection {

    public void demo(){
        System.out.println("reflection occurs");
    }
    }
}

エラーは次のとおりです:--

Exception in thread "main" java.lang.InstantiationException: reflaction.MyReflection$TestReflection
    at java.lang.Class.newInstance0(Class.java:357)
    at java.lang.Class.newInstance(Class.java:325)
    at reflaction.MyReflection.main(MyReflection.java:10)
4

4 に答える 4

1

これを使って:

public class MyReflection {

public static void main(String[] args) throws ClassNotFoundException,
        InstantiationException, IllegalAccessException,
        NoSuchMethodException, SecurityException, IllegalArgumentException,
        InvocationTargetException {
    Class outer = Class.forName("reflaction.MyReflection");
    Object outerInstance = outer.newInstance();

    Class<?> inner = Class
            .forName("reflaction.MyReflection$TestReflection");
    Constructor<?> constructor = inner.getDeclaredConstructor(outer);

    TestReflection innerInstance = (TestReflection) constructor
            .newInstance(outerInstance);

    innerInstance.demo();
}

class TestReflection {

    public void demo() {
        System.out.println("reflection occurs");
    }
}

のJavadocを見てくださいgetDeclaredConstructor(Class<?>... parameterTypes)。それは言います:

... この Class オブジェクトが非静的コンテキストで宣言された内部クラスを表している場合、仮パラメーターの型には、最初のパラメーターとして明示的な囲みインスタンスが含まれます。

したがって、外側のインスタンスを最初のパラメーターとして指定すると、内部クラスの新しいインスタンスが作成されます。

    TestReflection innerInstance = (TestReflection) constructor
            .newInstance(outerInstance);
于 2013-09-30T12:52:54.243 に答える