| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/05/2004 15:53:43
|
EddiE
Virtual Machine Man
Membro desde: 31/08/2002 09:05:07
Mensagens: 647
Localização: São Paulo - SP
Offline
|
Em JDBC uso Class.forName() com o nome da classe do Driver. Não é preciso receber o retorno e fazer nada com ele (como Class.forName().newInstance());
Como o Java usa esse Class retornado pelo Class.forName()? Lógico que não há nenhuma mágina mas não captei o que acontece por baixo do pano.
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/05/2004 16:32:11
|
cv
Moderador
![[Avatar]](/images/avatar/210f760a89db30aa72ca258a3483cc7f.jpg)
Membro desde: 04/04/2003 00:32:12
Mensagens: 7842
Localização: São Paulo, SP
Offline
|
Mais ou menos assim:
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/05/2004 17:32:38
|
Luca
Moderador
![[Avatar]](/images/avatar/17e62166fc8586dfa4d1bc0e1742c08b.jpg)
Membro desde: 06/09/2002 14:30:10
Mensagens: 5810
Localização: São Paulo/SP ou Paraty/RJ
Offline
|
Olá
forName carrega e inicia um objeto da classe cujo nome é passado como parâmetro
Indo um pouquinho mais além...
As classes Java são carregadas na memória em tempo de execução. As muitas classes do sistema não precisam estar todas na memória e nem mesmo se originarem todas da mesma localização. Para permitir esta facilidade o Java provê serviços que localizam e carregam classes. Estes serviços são feitos pelos class loaders. Usando os class loaders se pode dinamicamente achar e verificar classes, recursos e parâmetros de configuração.
Mostrando que existem os class loaders e ficando claro que as classes são carregadas dinamicamente por eles, vamos omitir alguns importantes conceitos e passar direto para ver o que faz o tal método forName da classe Class.
O método forname é um dos 2 modos que podem ser usados quando precisamos fazer o carregamento explicito de classes. O outro modo usa o método loadClass de uma classe que extenda ClassLoader. Como este último modo as vezes dava problemas antes do Java 1.3, ficou consagrado o uso do Class.forName para o carregamento explicito.
Segundo o javadoc da API há 2 métodos forName:static Class forName(String className)
Retorna o objeto Class associado com a classe ou interface com o dado nome passado como String
static Class forName(String name, boolean initialize, ClassLoader loader)
Retorna o objeto Class associado com a classe ou interface com o dado nome passado como String, usando o dado class loader. E na descrição de forName está:public static Class forName(String className) throws ClassNotFoundException
Retorna o objeto Class associado com a classe ou interface com o dado nome passado como String.
Chamar este método é equivalente a chamar Class.forName(className, true, currentLoader) onde currentLoader diz qual o class loder que carrega esta classe.
Por exemplo:
Class.forName("Foo")
é equivalente a:
Class.forName("Foo", true, this.getClass().getClassLoader())
Com a definição do javadoc de que forName ao retornar o objeto carrega e inicia a classe passada como parâmetro, podemos deduzir um fictício código para forName(String className)
No caso do JDBC você depois de usar Class.forName() com o nome da classe do Driver já obtem um objeto da classe corresponte ao driver.
[]s
Luca
|
Dare Obasanjo (Program Manager at Microsoft)
"The folks I know from across the industry who have to build large scale Web services on the Web today at Google, Yahoo!, Facebook, Windows Live, Amazon, etc are using RESTful Web services. The only times I encounter someone with good things to say about WS-* is if it is their job to pimp these technologies or they have already "invested" in WS-* and want to defend that investment."
CEP, JMS, JMX e coisas afins (ou não)
http://lucabastos.blogspot.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/05/2004 13:43:36
|
danieldestro
Moderador
![[Avatar]](/images/avatar/a5bfc9e07964f8dddeb95fc584cd965d.png)
Membro desde: 04/09/2002 17:26:16
Mensagens: 6667
Localização: São Paulo / Catanduva
Offline
|
cv, você disse, em poucas linhas, o que o Luca não disse em um "livro". heheheehehe
No flames Luca
|
gotjava?
Doe sangue
What You See Is What You Get!
Apostilas de Java grátis!
RefsCALL - Bandeira Eletrônica para Árbitro de Futebol |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/05/2004 14:53:54
|
cv
Moderador
![[Avatar]](/images/avatar/210f760a89db30aa72ca258a3483cc7f.jpg)
Membro desde: 04/04/2003 00:32:12
Mensagens: 7842
Localização: São Paulo, SP
Offline
|
As explicacoes foram complementares
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/05/2004 15:17:07
|
Luca
Moderador
![[Avatar]](/images/avatar/17e62166fc8586dfa4d1bc0e1742c08b.jpg)
Membro desde: 06/09/2002 14:30:10
Mensagens: 5810
Localização: São Paulo/SP ou Paraty/RJ
Offline
|
Olá
Daniel, discordo por 2 motivos:
1) Respondi com apenas uma frase e em negrito. O que escrevi depois foi apenas com o intuito de poder comentar que há 2 modos de fazer a mesma coisa e que um deles ficou mais comum.
2) Minha resposta foi feita antes de ler a do CV. Foi postada depois porque aqui tento fazer várias coisas ao mesmo tempo. Ao contrário do CV, respondi baseado na API. É óbvio que podia simplesmente colocar um link para lá.
[]s
Luca
|
Dare Obasanjo (Program Manager at Microsoft)
"The folks I know from across the industry who have to build large scale Web services on the Web today at Google, Yahoo!, Facebook, Windows Live, Amazon, etc are using RESTful Web services. The only times I encounter someone with good things to say about WS-* is if it is their job to pimp these technologies or they have already "invested" in WS-* and want to defend that investment."
CEP, JMS, JMX e coisas afins (ou não)
http://lucabastos.blogspot.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/05/2004 15:42:08
|
Vegetto
GUJ Ranger
Membro desde: 22/06/2003 15:39:49
Mensagens: 797
Localização: Campinas
Offline
|
Obrigado cv e Luca, vocês me exclareceram uma dúvida que há tempos me atormentava.
[]´s
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/05/2004 15:44:44
|
cv
Moderador
![[Avatar]](/images/avatar/210f760a89db30aa72ca258a3483cc7f.jpg)
Membro desde: 04/04/2003 00:32:12
Mensagens: 7842
Localização: São Paulo, SP
Offline
|
So lembrando que esse nao eh um bom padrão a ser seguido caso vc precise fazer uma API com drivers plugaveis, como a JDBC. Essa historia do Class.forName foi uma baita furada dos caras da Sun em esconder a complexidade da coisa. Nao era MUITO mais simples passar o nome da classe prum DriverManager da vida, escondendo mais ainda o que o programador tem que fazer? Encapsulamento, baby, encapsulameeeentoooo!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/05/2004 15:52:29
|
Luca
Moderador
![[Avatar]](/images/avatar/17e62166fc8586dfa4d1bc0e1742c08b.jpg)
Membro desde: 06/09/2002 14:30:10
Mensagens: 5810
Localização: São Paulo/SP ou Paraty/RJ
Offline
|
Olá
Já que é para complementar...
O uso de DriverManager está obsoleto, se ainda usam JDBC então usem DataSource.
[]s
Luca
|
Dare Obasanjo (Program Manager at Microsoft)
"The folks I know from across the industry who have to build large scale Web services on the Web today at Google, Yahoo!, Facebook, Windows Live, Amazon, etc are using RESTful Web services. The only times I encounter someone with good things to say about WS-* is if it is their job to pimp these technologies or they have already "invested" in WS-* and want to defend that investment."
CEP, JMS, JMX e coisas afins (ou não)
http://lucabastos.blogspot.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/05/2004 16:23:17
|
danieldestro
Moderador
![[Avatar]](/images/avatar/a5bfc9e07964f8dddeb95fc584cd965d.png)
Membro desde: 04/09/2002 17:26:16
Mensagens: 6667
Localização: São Paulo / Catanduva
Offline
|
Luca, a idéia não foi ofender.
Só quis dizer que o cv foi mais objetivo, respondendo à pergunta inicial ("o que acontece por debaixo dos panos?").
Eu mesmo tbm não sabia! Conhecia um pouco do funcionamento do forName( ), mas não sabia como funcionava no caso do JDBC / DriverManager.
Abraços
|
gotjava?
Doe sangue
What You See Is What You Get!
Apostilas de Java grátis!
RefsCALL - Bandeira Eletrônica para Árbitro de Futebol |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/05/2004 17:29:17
|
Rafael Steil
Administrador
![[Avatar]](/images/avatar/8e296a067a37563370ded05f5a3bf3ec.jpg)
Membro desde: 31/08/2002 02:35:53
Mensagens: 5984
Localização: São Paulo
Offline
|
neh.. eu acho que o daniel agiu de muita má fé mesmo.. eh bem o tipo dele
Rafael
|
"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"
http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/05/2004 10:04:37
|
danieldestro
Moderador
![[Avatar]](/images/avatar/a5bfc9e07964f8dddeb95fc584cd965d.png)
Membro desde: 04/09/2002 17:26:16
Mensagens: 6667
Localização: São Paulo / Catanduva
Offline
|
Rafael Steil wrote:neh.. eu acho que o daniel agiu de muita má fé mesmo.. eh bem o tipo dele
Rafael
Ooooo loco... assim vc me quebra as pernas!
|
gotjava?
Doe sangue
What You See Is What You Get!
Apostilas de Java grátis!
RefsCALL - Bandeira Eletrônica para Árbitro de Futebol |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/08/2009 15:25:09
|
leonardocoutoc
Thread.start()
![[Avatar]](/images/avatar/021cd7a416138abe57030f17bb3b2686.jpg)
Membro desde: 15/07/2008 10:19:21
Mensagens: 48
Offline
|
Pessoal,
Reabrindo esta thread, alguém pode me informa se quando eu utilizo Class.forName("") para carregar a classe Driver de conexão ao banco se quando eu chama o forName novamente em outro momento na minha aplicação, este metodo irá carregar a classe Driver novamente em memória ou irá utlizar a classe q já estava alocada na memoria anteriormente?
att,
Leonardo Couto.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/08/2009 16:33:42
|
Paulo Silveira
Administrador
![[Avatar]](/images/avatar/a87ff679a2f3e71d9181a67b7542122c.jpg)
Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline
|
Se voce esta na mesma hierarquia de classloader (provavelmente esta), ele não vai carregar novamente, pois vai perceber que já foi carregado. Mesmo assim, é boa prática você isolar esse código em algum lugar, para não ficar fazendo Class.forName sem necessidade e poluindo o código.
De uma olhada no draft sobre classloaders do livro Arquitetura Java para saber mais detalhes do funcionamento do classloader:
http://www.arquiteturajava.com.br/livro/entendendo-nosuchmethoderror-e-classloader-hell.pdf
A partir do JDBC 4 há um mecanismo mais inteligente para o carregamento dos drivers.
A classe que o Villela chamou de SeiLaOQue é o próprio DriverManager, que é invocado durante o bloco inicializador estático, como ele já mostrou.
|
http://blog.caelum.com.br twitter: @paulo_caelum
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/08/2009 08:49:46
|
leonardocoutoc
Thread.start()
![[Avatar]](/images/avatar/021cd7a416138abe57030f17bb3b2686.jpg)
Membro desde: 15/07/2008 10:19:21
Mensagens: 48
Offline
|
Paulo,
Muito obrigado pela ajuda, foi muito útil para o meu entendimento.
att,
Leonardo Couto.
|
|
|
 |
|
|