Sunteți pe pagina 1din 5

9/28/2017 Pocket: Entendendo ClassLoaders em Java

Entendendo ClassLoaders em Java


www.devmedia.com.br

ClassLoader uma classe que carrega outras classes ou de forma mais cient ca, a que
se encontra no pacote java.lang.ClassLoader, carregando os bytecodes da sua classe para
a memria. Assim, ela poder ser utilizada por toda sua aplicao. Esse mecanismo de
carregamento de classes nos permite ter vrias delas com o mesmo nome (exatamente
iguais), mas em ClassLoaders diferentes. isso que acontece, por exemplo, em
containers web atuais, onde temos vrias aplicaes distintas, mas pode ocorrer de uma
ou duas classes terem o mesmo nome, sem causar con ito algum.

Tudo em Java carregado atravs de ClassLoaders espec cos (que sero explicados mais
a frente). Ento voc pode se perguntar: se tudo carregado por um ClassLoader e o
prprio uma classe que tambm deve ser carregada, ento quem carrega o primeiro
ClassLoader que carregar as demais classes? Pensando nesse problema foi criado o
Bootstrap ClassLoader, escrito em linguagem nativa e que carregado antes de
qualquer outro na JVM, cando responsvel por inicializar pacotes essenciais para o
funcionamento da linguagem, como o pacote rt.jar.

https://getpocket.com/a/read/439498285 1/5
9/28/2017 Pocket: Entendendo ClassLoaders em Java

Ento se as classes Java so carregadas dinamicamente (atravs do ClassLoader) podemos


substituir o cdigo de uma classe e recarreg-la em tempo de execuo? Sim podemos.
Na verdade, vai alm disso, pois ainda podemos carregar uma classe remota atravs de
uma URL qualquer em tempo de execuo.

Exempli cando o ClassLoader em Java


Antes de explicarmos o funcionamento de cada ClassLoader nativo do Java, temos que
entender o porqu de seu uso ser to necessrio.

O ClassLoader, por padro, carrega todas as classes que esto presentes no seu
CLASSPATH. Ento no precisamos nem saber da existncia desse mecanismo de
loading. Classes so identi cadas atravs do seu fully quali ed name + class loader que a
carregou, assim temos a certeza que a Classe Funcionario da Aplicao 001 diferente da
Classe Funcionario da Aplicao 002.

Os ClassLoaders so teis quando trabalhamos com vrias aplicaes com verses de


bibliotecas diferentes. Imagine a aplicao 001 que trabalha com a verso 3.6 do
Hibernate, enquanto a aplicao 002 trabalha com a verso 3.3. Se estivessem
trabalhando no mesmo ClassLoader teramos con itos em classes como
org.hibernate.Session, por estarem carregadas duas vezes na memria, mas com
ClassLoaders distintos podemos fazer isso.

https://getpocket.com/a/read/439498285 2/5
9/28/2017 Pocket: Entendendo ClassLoaders em Java

No cdigo a seguir temos o carregamento/loading de uma classe na memria:

O parmetro className corresponde ao nome absoluto da classe, ou seja, o nome


completo com o caminho do pacote (br.com.meupacote.MinhaClass). O parmetro
booleano resolveIt diz se as classes associadas nossa classe carregada tambm devem
ser carregadas, como se fosse um cascade de loadings.

Mecanismos de ClassLoader
Temos trs tipos de ClassLoaders nativos: Bootstrap ClassLoader, Extension ClassLoader
e Application ClassLoader. Cada um desses tem sua respectiva funo:

Bootstrap ClassLoader: esse responsvel por carregar as classes do rt.jar e no


possui nenhum parente, pois ele o pai de todos os outros. Sendo assim,
asseguramos que ningum vai modi car as classes do rt.jar, como do pacote
java.lang;
Extension ClassLoader: esse responsvel por carregar os JARs que esto dentro
do diretrio da propriedade java.ext.dirs que, por padro, $JAVA_HOME/lib/ext.
O pai desse ClassLoader o Bootstrap ClassLoader;
Application ClassLoader: esse responsvel por carregar todas as classes da sua
aplicao, ou seja, tudo de nido do seu CLASSPATH. O pai de Application
ClassLoader o Extension ClassLoader.

https://getpocket.com/a/read/439498285 3/5
9/28/2017 Pocket: Entendendo ClassLoaders em Java

Podemos dar um exemplo mais completo carregando uma classe dinamicamente atravs
do loadClass, como mostra o exemplo da Listagem 1.

Listagem 1. Carregando Classe

A sada do cdigo apresentado ser algo como: aClass.getName() = AnotherClass.

Vamos agora criar nosso prprio ClassLoader, que tem como principal mtodo o
loadClass, que responsvel por carregar a classe que desejamos, como mostra a
Listagem 2.

Listagem 2. Criando nosso prprio ClassLoader

Quando queremos carregar a classe, essa deve estar dentro do pacote re ection e
utilizamos o nome MyObject numa URL prpria para isso. Caso contrrio, passaremos a
responsabilidade para o ClassLoader parent.

Na Listagem 3 vamos criar um mtodo main que utilizar nosso ClassLoader.

Listagem 3. Utilizando o nosso ClassLoader

https://getpocket.com/a/read/439498285 4/5
9/28/2017 Pocket: Entendendo ClassLoaders em Java

Primeiramente capturamos o parent do nosso ClassLoader (MyClassLoader) do nosso


ClassLoader. Ento criamos uma instncia dele, passando como parmetro o seu
parente, assim poder delegar a funo de loadClass para o parente, caso necessite.

Carregamos a classe re ection.MyObject no nosso novo ClassLoader (lembre-se que


nessa hora ele carregar a classe de uma URL espec ca, que diferente do nosso
CLASSPATH). Agora temos a classe carregada em um classLoader prprio e podemos
ento recarregar a mesma, fazer um reloading e um loadClass.

Raramente precisaremos criar o nosso prprio ClassLoader ou nunca precisar trabalhar


com ele diretamente, mas a sua utilidade como um todo essencial e o conhecimento
desse um diferencial. Voc poder resolver problemas como NoClassDefFoundError
em pouco tempo, apenas conhecendo o princpio bsico do funcionamento do
ClassLoader. Nesse caso, a classe pode existir sicamente, mas em outro ClassLoader,
que no o mesmo que a aplicao est utilizando.

Esses conceitos, mesmo no sendo utilizados na prtica, so importantes e podem abrir


um leque de opes ao tentar entender problemas que ocorrem frequentemente.

https://getpocket.com/a/read/439498285 5/5

S-ar putea să vă placă și