[ Resolvido ] Error ao fazer Reflection

6 respostas
Jedi_FeniX

Criei uma API que usa reflection para intanciar algumas classes, quando eu crio uma class com o método main esta API funciona, mas quando eu faço o deploy desta api no tomcat ele não consegue instanciar a classe dinamicamente. Alguém sabe aonde está o erro?

6 Respostas

Guilherme_Gomes

Seria legal mais informações… Partes de codigos, erro gerado…

Jedi_FeniX

Parte do código aonde eu faço a reflection:

public static RequestMessageImpl newRequestMessage(MessageGeneric message, String tel, String send) throws ConfigurationServerException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { RequestMessageImpl request = ( RequestMessageImpl ) ClassLoader .getSystemClassLoader() .loadClass( ConfigurationServer.getClazz() ) .getConstructors()[0] .newInstance( message, tel, send, ServerFactory.getServer( tel) ); return request; }

Erro gerado:

java.lang.ClassNotFoundException: test.request.TestRequest

Lembrando que TestRequest implementa RequestMessageImpl.

E

De fato, você não pode usar o “system classloader” e sim outro que foi usado, por exemplo, para carregar sua aplicação.

Jedi_FeniX

Não teria uma forma de deixar isso dinâmico? Ele pegar o classloader do ambiente aonde a aplicação está rodando?

Guilherme_Gomes

Faça assim:

public class ClasseX{
    public static RequestMessageImpl newRequestMessage(MessageGeneric message, String tel, String send) throws ConfigurationServerException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
       RequestMessageImpl request = ( RequestMessageImpl ) ClasseX.class.getClassLoader()
                .loadClass( ConfigurationServer.getClazz() )
                .getConstructors()[0]
                .newInstance( message, tel, send, ServerFactory.getServer( tel) );
        return request;
    }
}

Ele vai subindo pro ClassLoader pai, enquanto não encontrar a classe que você pediu!

Jedi_FeniX

Fiz esta solução também, porque não tinha visto a sua Guilherme…

<a>code</a> Class.forName( ConfigurationServer.getClazz() )

.getConstructors()[0].

newInstance( message, msisdn, sender, ServerFactory.getServer( msisdn ) );

[/code]

E esta também funciona nos dois ambientes.

Valeu pela ajuda de todos e acabou ficando duas soluções…  <img src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14/assets/72x72/s.pngmiley.png?v=6" title=":smiley:" class="emoji" alt=":smiley:">
Criado 22 de setembro de 2009
Ultima resposta 22 de set. de 2009
Respostas 6
Participantes 3