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?
[ Resolvido ] Error ao fazer Reflection
6 Respostas
Seria legal mais informações… Partes de codigos, erro gerado…
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.
De fato, você não pode usar o “system classloader” e sim outro que foi usado, por exemplo, para carregar sua aplicação.
Não teria uma forma de deixar isso dinâmico? Ele pegar o classloader do ambiente aonde a aplicação está rodando?
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!
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:">