InstantiationException при простом рефлексивном вызове newInstance в классе? - PullRequest
11 голосов
/ 26 октября 2011

У меня есть абстрактный класс A, т. Е.

public abstract class A {

    private final Object o;

    public A(Object o) {
        this.o = o;
    }

    public int a() {
        return 0;
    }

    public abstract int b();

}

У меня есть подкласс B, т. Е.

public class B extends A {

    public B(Object o) {
        super(o);
    }

    @Override
    public int a() {
        return 1;
    }

    @Override
    public int b() {
        return 2;
    }

}

Я выполняю следующий фрагмент кода:

Constructor c = B.class.getDeclaredConstructor(Object.class);
B b = (B) c.newInstance(new Object());

и получение исключения InstantiationException при вызове newInstance, более конкретно:

java.lang.InstantiationException
    at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:30)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)

Я не знаю, почему я получаю исключение.Я смотрел на некоторые другие подобные вопросы и видел вещи об использовании конечных переменных при вызове супер-конструктора или проблем с абстрактной природой родительского класса, но я не смог найти однозначного ответа на вопрос, почему именно в этой конкретной ситуации возникает исключение InstantiationException.Есть идеи?

Ответы [ 2 ]

32 голосов
/ 26 октября 2011

Вы уверены, что B не определено с ключевым словом abstract? Я могу воспроизвести ошибку, если я объявлю класс как public abstract class B.

1 голос
/ 14 января 2015

Метод newInstance () фактически не принимает аргументов - он только запускает конструктор с нулевым аргументом. Он вызовет InstantiationException, если у вашего класса нет конструктора с нулевыми параметрами.

...