[quote]I tried to load classes with forName but some classes I tried to
loaded didn’t have a default constructor. That caused a
java.lang.NoClassDefFoundError which can’t be cought. [/quote]
Esta classe clazz não pode ser instanciada, porque seu construtor é privado. Não importa se é por reflection ou não.
public class Test
{
public static void main(String args[])throws Exception{
Class cl = Class.forName("clazz");
System.out.println("class "+cl.getName());
}
}
class clazz{
private clazz(int i){
}
}
Se não houver um construtor default explícito, você não pode chamar Class.forInstance() para chamar o construtor default (explícito ou implícito) se houver um construtor que não é default e for explícito, já que nenhum construtor default implícito vai ser gerado pelo compilador nesse caso. Só que nesse caso você poderia ainda assim instanciar a classe, usando a classe Constructor que está disponível no pacote java.lang.reflect.
Class.forInstance() chama o construtor public (ou protected, ou package-private - depende da visibilidade) que não tiver parâmetro nenhum. Normalmente esse seria o construtor “default”.
O compilador habitualmente gera um construtor “default” - ele é normalmente:
public SuaClasse () {
super();
}
Ele não gera o tal construtor se:
Você mesmo fez isso (definiu seu construtor sem parâmetros)
Não existe um construtor sem parâmetros na superclasse (ou seja, ele não consegue chamar “super”)
Você definiu outros construtores (mesmo que sejam com parâmetros), por exemplo: