ОБНОВЛЕНИЕ : Мой вопрос не связан с Создать экземпляр класса .Этот вопрос просто должен создать экземпляр enum с одним из существующих значений.Я спрашиваю: почему API Reflection генерирует NoSuchMethodException
для метода, который действительно существует ?.
Следующий код выполняется без ошибок или нет, в зависимости от того, объявлен ли Xpto
как class
или enum
.
class Xpto {
// Bar; // include this for enum declaration
private Xpto() {
}
}
public class App {
public static void main(String[] args) throws Exception{
Constructor<Xpto> constructor = Xpto.class.getDeclaredConstructor();
constructor.setAccessible(true);
constructor.newInstance();
}
}
В обоих случаях javap
показывает конструктор private Xpto()
.Если Xpto
является классом, то результат javap -private
будет:
class Xpto {
private Xpto();
}
Если Xpto
является перечислением, то результат javap -private
будет:
final class Xpto extends java.lang.Enum<Xpto> {
...
private Xpto();
static {};
}
Тем не менее, для последнего он выдает исключение:
Exception in thread "main" java.lang.NoSuchMethodException: Xpto.<init>()
at java.lang.Class.getConstructor0(Unknown Source)
В обоих случаях результатом компиляции является класс с закрытым конструктором .Использование API отражения в Xpto.class.getDeclaredConstructor();
не сообщает об ошибке относительно факта, что Xpto
является перечислением, или нет.Это просто бросает, что нет такого метода Xpto.<init>()
для случая перечисления. Это не так .Потому что этот конструктор существует.