| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/12/2009 14:14:22
|
Jean_Utf
Thread.start()
Membro desde: 26/03/2008 19:21:15
Mensagens: 46
Offline
|
Dae pessoal,
Estou com uma dúvida:
To usando Reflaction e precisava descobrir, em tempo de execução, o tipo da classe.
Por exemplo
Class classe = Class.forName("eventos.TEventoAssociacao");
a partir do class eu preciso saber que o tipo é TEventoAssociacao, pra usar essa informação
num cast em tempo de execução. Isso é possível??
Valeu.
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/12/2009 14:22:07
|
lgweb
GUJ Master
Membro desde: 03/05/2007 20:59:55
Mensagens: 1048
Localização: Curitiba-PR
Offline
|
assim nao dá?
melhorando:
This message was edited 1 time. Last update was at 17/12/2009 14:24:59
|
Vc gosta de criar topicos duplicados?
Nao utiliza a busca antes de postar?
veja:
http://www.youtube.com/watch?v=8zFYt1_0FUE&NR=1 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/12/2009 14:29:52
|
Jean_Utf
Thread.start()
Membro desde: 26/03/2008 19:21:15
Mensagens: 46
Offline
|
O meu problema é o seguinte:
Tenho várias classes eventos no meu sistema. Então fiz uma espécie de Factory pra obter esses eventos. Cada evento
possui um tipo (utilizei uma enum) e então passo esse valor para a Factory pra ela me retornar a instancia correta.
Mas como a Factory retorna um Object, preciso retornar também o Type dele para que eu possa fazer um cast em tempo de execução.
Entendeu?
Será que tem como?
Valeu
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/12/2009 14:47:59
|
cleisonrlima
What is classpath?
Membro desde: 05/10/2009 22:21:56
Mensagens: 7
Offline
|
Voce pode implementar o Metadata.
Caso contrario você pode tb verificar a instancia e fazer o cast.
Att.
Cleison R. Lima
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/12/2009 14:50:27
|
Jean_Utf
Thread.start()
Membro desde: 26/03/2008 19:21:15
Mensagens: 46
Offline
|
Justamente pra não ter que fazer esses ifs é que eu queria o Type. Pq senão na classe que eu chamo o Factory, como eu passo a enum TipoEvento, eu já sei de que classe é. Mas queria que fosse abstrato e que as classes que utilizam o evento não conhecessem os tipos. Tudo pra que quando eu adicionar uma nova classe Evento, eu não precisasse mudar nada no restante do código. Mudaria apenas na Factory.
This message was edited 3 times. Last update was at 17/12/2009 14:53:57
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/12/2009 15:09:00
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Dado um objeto do tipo java.lang.Class (obtido, por exemplo, a partir de Class.forName):
- Para efetuar um cast - use asSubclass: http://java.sun.com/javase/6/docs/api/java/lang/Class.html#asSubclass%28java.lang.Class%29
- Para determinar se é um "instanceof": - use isAssignableFrom ou isInstance (dependendo do que você quer).
http://java.sun.com/javase/6/docs/api/java/lang/Class.html
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/12/2009 15:27:55
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
Jean_Utf wrote:Dae pessoal,
Estou com uma dúvida:
To usando Reflaction e precisava descobrir, em tempo de execução, o tipo da classe.
Por exemplo
Class classe = Class.forName("eventos.TEventoAssociacao");
a partir do class eu preciso saber que o tipo é TEventoAssociacao, pra usar essa informação
num cast em tempo de execução. Isso é possível??
Valeu.
Primeiro, java não é Delphi. Livre-se desse prefixo T.
Segundo a sua ideia não faz sentido.
Se vc carrega a classe dinamicamente vc não sabe qual é. Não faz sentido fazer cast.
Agora, se todas as classes que vc carrega dinamicamente foram filhas de uma classe ou interface comum, vc pode retornar um objeto dessa classe. Algo assim:
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/12/2009 16:03:32
|
dipeloco
JavaChild
![[Avatar]](/images/avatar/6b59f92676fd007e9cc45d7f3fdd51f4.png)
Membro desde: 21/05/2007 12:14:11
Mensagens: 123
Offline
|
Perfeita resposta do Sergio.
Se precisa fazer cast de algo dinamico assim ... tem algo errado na sua ideia de implementação.
Uma opção valida é a da interface assim vc pode ("Não que seja certo"), criar um metodo para cada tipo esperado e chamar a funcao dependendo do simple name da class
This message was edited 1 time. Last update was at 17/12/2009 16:05:09
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/12/2009 00:06:17
|
Jean_Utf
Thread.start()
Membro desde: 26/03/2008 19:21:15
Mensagens: 46
Offline
|
sergiotaborda wrote:
Jean_Utf wrote:Dae pessoal,
Estou com uma dúvida:
To usando Reflaction e precisava descobrir, em tempo de execução, o tipo da classe.
Por exemplo
Class classe = Class.forName("eventos.TEventoAssociacao");
a partir do class eu preciso saber que o tipo é TEventoAssociacao, pra usar essa informação
num cast em tempo de execução. Isso é possível??
Valeu.
Primeiro, java não é Delphi. Livre-se desse prefixo T.
Segundo a sua ideia não faz sentido.
Se vc carrega a classe dinamicamente vc não sabe qual é. Não faz sentido fazer cast.
Agora, se todas as classes que vc carrega dinamicamente foram filhas de uma classe ou interface comum, vc pode retornar um objeto dessa classe. Algo assim:
O "T" é padrão da empresa para nome de classe. "A", classe abstrata.. "E", enum.. enfim...
Entendi o que vocês falaram.. realmente o que eu to tentando me pareceu um pouco de chuncho...
Uma Factory deve retornar objetos comuns a uma interface... o problema é que cada Evento tem seus métodos
distintos.
Pensando aqui, acho que achei uma solução.. vou criar uma interface com um método setCampos(List listaCampos)
e passar a lista de campos do Evento. Assim cada objeto conhece a ordem dos campos, e que atributo aquele campo
referencia..
Isso resolve meu problema. =)
O código seria mais ou menos assim antes:
Com a nova solução ficaria:
Meio por cima... não sei se consegui me expressar bem...
Mas valeu pelas opiniões... foram bem úteis!!
Até mais!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/12/2009 13:48:22
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
O problema nessa historia é vc ter uma classe de tipo.
Veja bem o tipo de um evento é a classe do evento. Vc não precisa ter um enum ou coisa assim.
Além disso a factory pode carregar os dados para vc
O correto ( o mais correto) seria algo assim:
A assinatura do newInstance seria assim
Não gostei dessa solução de passar os campos ,mas em termos de design é melhor do que tinha antes.
Essa lista de parametros significa que vc deveria estar escrevendo na realidade
P.S. Essa nomenclatura da "empresa" é uma porcaria. Faça o que conseguir para mudar isso. Leia "Clean Code" do Robert C Martin e mostre a eles se for necessário.
This message was edited 1 time. Last update was at 18/12/2009 13:48:57
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/12/2009 15:11:15
|
Jean_Utf
Thread.start()
Membro desde: 26/03/2008 19:21:15
Mensagens: 46
Offline
|
Entendi!
Na verdade, eu recebo um pacote de bytes, e, a partir deles, preciso criar os objetos eventos. Um dos campos do pacote é o tipo
do evento. Com ele minha classe de Protocolo pode tomar a decisão de que objeto vai retornar. Por isso usei uma enum. Em C++ é muito
mais fácil, por que eu consigo atribuir um inteiro numa enum.. enfim...
Agora deixar para a Factory atribuir os dados ou não, acho indiferente.
Valeu pelas dicas..
Java apavora. (menos enum..rs)
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/12/2009 15:20:40
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
Jean_Utf wrote:Entendi!
Na verdade, eu recebo um pacote de bytes, e, a partir deles, preciso criar os objetos eventos. Um dos campos do pacote é o tipo
do evento. Com ele minha classe de Protocolo pode tomar a decisão de que objeto vai retornar. Por isso usei uma enum. Em C++ é muito
mais fácil, por que eu consigo atribuir um inteiro numa enum.. enfim...
Agora deixar para a Factory atribuir os dados ou não, acho indiferente.
Vc pode achar , mas não é.
enum sim pode receber inteiros. Basta criar um campo que seja um inteiro.
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/12/2009 15:28:27
|
Jean_Utf
Thread.start()
Membro desde: 26/03/2008 19:21:15
Mensagens: 46
Offline
|
Em C++ eu tenho uma
Caso eu fizer
"tipo" vai valer A.
Em java não consigo fazer isso.
|
|
|
 |
|
|