Pergunta

Alguém pode me ponto um bom recurso ou explicar-me sobre o conceito por trás de classe Carregadeira? Eu encontrei o seguinte recurso em carregadores de classe http://www.onjava.com/lpt/a/5586 mas ainda sem ajuda. As perguntas a seguir pode parecer bobagem, mas tentar responder-lhes sempre me confunde.

  • Por que os desenvolvedores a escrever carregadores de classe personalizados, por que não chamar um carregador de classe Bootstrap para invocar suas classes personalizadas? Qual é a necessidade de definir carregadores de classe personalizados?
  • Por que há tantas variedades de carregadores de classe? por exemplo:. Bootsrap, Comman, Catalina carregador de classe etc,

    Agradecemos antecipadamente.

Foi útil?

Solução

Eu encontrei o seguinte, razões válidas para criar classloaders personalizados:

  1. Você deseja carregar uma classe a partir de uma fonte não convencional (Por exemplo, o bytecode para uma classe é armazenada em um banco de dados, através da rede ou transportada como 0 e 1s por pidgeons - MessengerPidgeonClassLoader). Há algumas implementações ClassLoader já na API para tais casos, como URLClassLoader .

  2. Você precisa definir uma hierarquia diferente para classes de carga. implementações padrão do ClassLoader delegar a busca primeiro para o pai, então eles tentam carregar a classe se. Talvez você quer uma hierarquia diferente. Esta é a razão pela qual OSGI e Eclipse tem seus próprios ClassLoaders como os arquivos de manifesto .mf definir todos os tipos de caminhos de hierarquia estranhas (buddy-classloading, por exemplo). Todos os classloaders Eclipse implementar a interface BundleClassLoader e ter algum código extra para encontrar recursos dentro do Eclipse plug-ins.

  3. Você precisa fazer alguma modificação para o bytecode. Talvez o bytecode é criptografada, e você vai unencrypt-lo on the fly ( Não que isso ajuda, realmente, mas foi tentado ). Talvez você queira "patch" as classes carregadas na mosca (A la JDO bytecode realce).

Usando um carregador de classe diferente do Classloader do sistema é necessária se você precisa de aulas de descarregamento a partir da memória, ou para classes de carga que poderia mudar a sua definição em tempo de execução. Um caso típico é um aplicativo que gera uma classe em tempo real a partir de um arquivo XML, por exemplo, e em seguida, tenta recarregar esta classe. Uma vez que a classe está no Classloader sistema, não há nenhuma maneira de descarregá-lo e ter uma nova definição.

Outras dicas

Um uso comum do classloaders é isolar um JAR. Se você tiver um aplicativo que usa plugins ( Eclipse , Maven 2 ), então você pode ter esta situação: Plugin X precisa frasco a com a versão 1.0, enquanto o plugin Y precisa do mesmo frasco, mas a versão 2.0. X não funcionar com a versão 2.0, no entanto.

Se você tem classloaders, você pode criar partições de classes (pensar em ilhas isoladas ligadas por pontes finas; as pontes são os carregadores de classe). Desta forma, os carregadores de classe pode controlar o que cada plugin pode ver.

Quando plug-in X instancia uma classe Foo, que tem campos estáticos, isso não é problema e não haverá uma confusão com a "mesma" classe em plugins Y porque cada carregador de classe irá de fato criar a sua própria instância da classe foo. Então você tem duas classes na memória, onde cl1.getName().equals(cl2.getName()) é true mas cl1.equals(cl2) não é. Isto significa que as instâncias de cl1 não são atribuição compatível com instâncias de Cl2. Isso pode levar a ClassCastExceptions estranho que dizer que org.project.Foo não pode ser atribuído a org.project.Foo.

Assim como com ilhas remotas, as duas classes não estão cientes de que o outro existe. Pense em clones humanos que nascem e depois criados em ilhas diferentes. Do ponto de vista da VM, não há problema, porque as instâncias do tipo classe são tratados como qualquer outro objeto: Pode haver vários deles. Que você acha que alguns deles são "o mesmo" não importa para a VM.

Outro uso para este padrão é que você pode se livrar das classes carregado desta maneira: Apenas certifique-se de que ninguém tem um ponteiro para qualquer objeto criado a partir de classes carregadas a partir de um carregador de classe e, em seguida, esquecer o carregador de classe, também. Na próxima execução da GC , todas as classes carregados por este carregador de classe são removidos da memória . Isso permite que você "recarregar" sua aplicação sem ter que reiniciar todo o VM.

par de blogs Um que eu escrevi no passado profundo sobre o uso de carregadores de classe pós-delegação:

Você não pode ir além da fonte de matéria, em casos como este. Se você realmente quiser que o interior droga, o núcleo duro , leia os bits relevantes do Java Virtual Machine Specification .

Outra boa ligação para carregadores de classe Java - Java classloaders

É extremamente raro que você precisa para criar o seu próprio ClassLoader. E genereally se você precisar, você já deve ter um bom entendimento do que o ClassLoader faz.

Em outras palavras, se você está perguntando por que você precisa para criar seu próprio ClassLoader, em seguida, você não precisa criar um;)

Dito isto, eu também vi um ClassLoader sendo criado para uma aplicação que lidou com criptografia. Desta forma, toda vez que você criar um java.netSocket ou algum tipo de objeto de arquivo / fluxo, em vez de usar as versões de JVM que vai usar seus próprios personalizados especial classes internas. Dessa forma, eles podem garantir a que toda a informação foi criptografada e que não houve erros desenvolvedor.

Mas não é muito comum. Você pode ir toda uma carreira Java sem precisar criar o seu próprio ClassLoader personalizado. Na verdade, se você precisa criar um, você deve realmente perguntar se é necessário.

Por que os desenvolvedores a escrever carregadores de classe personalizados, por que não chamar um carregador de classe Bootstrap para invocar suas classes personalizadas? Qual é a necessidade de definir carregadores de classe personalizados?

Dependendo da aplicação, os desenvolvedores podem substituir ou substituir completamente o mecanismo de carregamento de classe para atender às suas necessidades.

Por exemplo, eu usei uma aplicação cujas classes são carregados a partir de uma LDAP: S

Outros aplicativos precisam classe independente de gestão (como a maioria dos servidores de aplicativos que suporte hot-deploy)

Sobre recursos, há toneladas, na web, que simplesmente não podem ser listados.

Um exemplo:

WebAppClassloader uso Tomcat personalizada para classes de carga e isolar / frascos de diferentes aplicações web.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top