Olá a todos,
Estou com um problema ao utilizar reflection… tenho um código assim:
[code]try {
synchronized ( MUTEX ) {
Class clazz = Class.forName( frame);
frame = (JFrame) clazz.newInstance();
}catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}[/code]
No meu primeiro teste não tinha o bloco sincronizado… porém, quando eu tentava acessar esse código através de várias threads diferentes eu recebia um erro assim:
Depois de colocar em um bloco sincronizado… o problema parou de ocorrer… mas passei a ter problemas com deadlock entre as minhas threads com as threads do swing… alguém sabe como eu deveria fazer para poder criar esse frame usando reflection sem gerar esses problemas em ambientes multi-threads?
grato pela atenção,
Éberson
O problema é mais abrangente do que só esse pedaço de código…
o código para iniciar o carregamento, a referência deve trazer para instanciar a classe. eg.
try{
Object instance = Class.forName ( "javax.swing.JFrame). NewInstance ();
JFrame frame = (JFrame) instance;
}catch(Exception ex){
ex.printStackTrace();
}
[quote=rogelgarcia]O problema é mais abrangente do que só esse pedaço de código…
[/quote]
Sim, tem razão… acabei notando que o problema ocorria dentro do método invocado (no caso o construtor) e não no uso de reflexão. Ele fazia uso de uma coleção que não estava devidamente sincronizada.
No entanto, estou com uma dúvida: Reflection pode ser considerada thread safe?
Imagino o seguinte: Para fazer uso de reflexão eu vou acessar diretamente o objeto Class. Ao carregar o objeto class com Class.forName eu vou ter apenas uma instância dessa class, correto? Ao fazer uso desse class num contexto multi-thread é possível que várias delas acessem esse class ao mesmo tempo? Como poderia corrigir? Sincronizando o class em questão ou tem outra forma melhor?
[]