Ошибка: вы вызываете неправильный конструктор - и компилятор не может вам помочь.
Проблема, с которой вы столкнулись, заключается в простом доступе к конструктору с нулевым аргументом, а не к конструктору с аргументами. Помните, что конструкторы в java - это, в конечном счете, просто методы, хотя и специальные - и с учетом того, что все ставки отключены - компилятор не поможет вам, если вы сделаете что-то глупое. В вашем случае у вас возникла проблема с областью действия, а также проблема с сигнатурой метода.
Как решить эту проблему, и НИКОГДА не иметь дело с ней снова в этом приложении
Хорошая идея - обернуть вызовы конструктора в статический вспомогательный метод, который может быть непосредственно протестирован , а затем явно поставить тест для них в моих модульных тестах, потому что если конструктор изменится, и вы забудете обновите свой код отражения, вы снова увидите, как эти загадочные ошибки снова появляются.
Вы также можете просто вызвать конструктор следующим образом:
public static Child create(Integer i, String s) throws Exception
{
Constructor c = Class.forName(childClass).getConstructor(new Object[]{Integer.class, String.class});
c.setAccessible(true);
Child instance = (Child) c.newInstance(new Object[]{i , s}) ;
return instance;
}
и, конечно, добавьте к своим тестам
@Test
public void testInvoke()
{
try{
MyClass.create(1,"test");
}
catch(Exception e)
{
Assert.fail("Invocation failed : check api for reflection classes in " + MyClass.class);
}
}