Java.lang.NoClassDefFoundError

Olá pessoal!

Gostaria de saber se a falta de um construtor default explícito numa classe pode causar java.lang.NoClassDefFoundError quando usamos reflexão.

Segundo:
http://groups.google.com/group/comp.lang.java.programmer/browse_thread/thread/21d6bb79c5f22c1d/8512a846a9c3f82d?lnk=st&q=Caused+by%3A+java.lang.NoClassDefFoundError%3A&rnum=3#8512a846a9c3f82d:

[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]

Agradeço desde já!

Pestana

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.

Obrigado por responder a minha pergunta, thingol!

Não entendí sua frase:

Poderia me explicar melhor?

grato,

Pestana

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:
public SuaClasse (int x) {
    bla bla bla
}