Enquanto trabalhamos em Java, geralmente usamos um grande número de classes. Essas classes Java não são carregadas todas de uma vez na memória; em vez disso, são carregadas quando exigidas por um aplicativo. É aqui que entram em cena os Java ClassLoaders. Portanto, neste artigo, discutirei como usar o ClassLoader em Java, juntamente com exemplos.
Os seguintes tópicos serão abordados neste artigo:
- O que é ClassLoader?
- Tipos de ClassLoader
- Princípios de ClassLoader
- Métodos de ClassLoader
- ClassLoader personalizado
Vamos começar!
O que é ClassLoader em Java?
ClassLoader em Java é chamado pelo Java Runtime Environment para carregar dinamicamente as classes sempre que exigido pelo aplicativo no Máquina Virtual JAVA . Como ClassLoaders são parte do Java Runtime Environment, a Java Virtual Machine não terá nenhuma ideia sobre os arquivos e sistemas de arquivos subjacentes.
vantagens e desvantagens do python
Agora, vamos entender os diferentes tipos de ClassLoaders integrados em Java.
Tipos de ClassLoader em Java
Os diferentes tipos de ClassLoaders em Java são os seguintes:
Vamos discutir cada um deles um por um.
Extension ClassLoader
Como o nome sugere, Extension ClassLoader carrega as extensões das principais classes Java do JDK Biblioteca de extensão. É um filho do Bootstrap ClassLoader e carrega as extensões do diretório JRE / lib / text ou de qualquer outro diretório especificado na propriedade de sistema java.ext.dirs.
Aplicativo ou sistema ClassLoader
O Application ou System ClassLoader é filho do Extension ClassLoader. Este tipo de ClassLoader carrega todas as classes de nível de aplicativo encontradas na opção de linha de comando -cp ou na variável de ambiente CLASSPATH.
Bootstrap ClassLoader
Como todos nós sabemos isso Aulas de Java são carregados por uma instância de java.lang.ClassLoade. Mas, como ClassLoaders são classes, o Bootstrap ClassLoader é responsável por carregar as classes internas do JDK. BootStrap ClassLoader é um código de máquina que inicia a operação quando a JVM o chama e carrega as classes de rt.jar. Portanto, você pode entender que o Bootstrap ClassLoader serve não tem ClassLoader pai e, portanto, é conhecido como ClassLoader Primordial.
Nota: A prioridade do Bootstrap é maior do que Extension, e a prioridade dada ao Extension ClassLoader é maior do que Application ClassLoader. Consulte a imagem abaixo:
A seguir neste artigo, vamos entender os princípios nos quais o ClassLoader funciona.
Princípios de ClassLoader em Java
O conjunto de regras com base nas quais o Java ClassLoader funciona são os três princípios a seguir:
Vamos entender cada um deles.
Propriedade de exclusividade
Esta propriedade garante que não haja repetição de classes e que todas as classes sejam únicas. A propriedade uniqueness também garante que as classes carregadas pelo ClassLoader pai não sejam carregadas pelo ClassLoader filho. Em um cenário em que o ClassLoader pai não consegue encontrar a classe, a instância atual tentará fazer isso sozinha.
Modelo de Delegação
ClassLoader em Java funciona com base no conjunto de operações fornecidas pelo modelo de delegação. Portanto, sempre que uma solicitação é gerada para encontrar uma classe ou recurso, uma instância de ClassLoader delegará a pesquisa da classe ou do recurso ao ClassLoader pai.
O conjunto de operações com base nas quais o ClassLoader funciona são os seguintes:
- A Java Virtual Machine verifica se a classe está carregada ou não, sempre que se depara com uma classe.
- No caso em que a classe é carregada JVM prossegue com a execução da classe, mas em um cenário onde a classe não é carregada, entãoA JVM pede ao subsistema Java ClassLoader para carregar essa classe particular. Depois disso, o subsistema ClassLoader dá o controle ao Application ClassLoader.
- O Application ClassLoader então delega a solicitação ao Extension ClassLoader, que a partir de então passa a solicitação ao Bootstrap ClassLoader.
- Agora, o Bootstrap ClassLoader procura noClasspath de bootstrap para verificar se a classe está disponível ou não. Se a classe estiver disponível, ela será carregada; caso contrário, a solicitação será novamente passada para o Extension ClassLoader.
- O Extension ClassLoader verifica a classe no classpath de extensão.Se a classe estiver disponível, ela será carregada; caso contrário, a solicitação será novamente enviada ao Application ClassLoader.
- Finalmente, o Application ClassLoader procura a classe no classpath do aplicativo.Se a classe estiver disponível, ela será carregada; caso contrário, você verá uma exceção de ClassNotFoundException.
Consulte a imagem abaixo.
Princípio de Visibilidade
De acordo com este princípio, as classes dos filhos são visíveis para as classes carregadas por seus ClassLoaders pai, mas o contrário não é verdade. Portanto, as classes carregadas pelo Application ClassLoader têm visibilidade das classes carregadas pelo Extension e Bootstrap ClassLoader.
Por exemplo, se tivermos duas classes: A e B, suponha que a classe A seja carregada pelo Application ClassLoader e a classe B seja carregada pelo Extensions ClassLoader. Aqui, as classes A e B são visíveis para todas as classes carregadas pelo Application ClassLoader, mas a classe B é visível apenas para as classes carregadas pelo Extension ClassLoader.
Além disso, se você tentar carregar essas classes usando o Bootstrap ClassLoader, verá o java.lang.ClassNotFoundException . exceção.
Tudo bem, agora que você conhece os tipos de ClassLoaders e os princípios por trás deles, vamos examinar alguns métodos importantesde java.lang.ClassLoader classe.
Métodos de ClassLoader em Java
Poucos essenciais de ClassLoader são os seguintes:
- loadClass (nome da string, resolução booleana)
- defineClass ()
- findClass (nome da string)
- Class.forName (nome da string, inicialização booleana, carregador ClassLoader)
- getParent ()
- getResource ()
loadClass (nome da string, resolução booleana)
Este método é o ponto de entrada do ClassLoader e é usado para carregar a classe referenciada pela JVM. Leva o nome do como um parâmetro. A JVM chama o método loadClass () para resolver as referências de classe configurando o valor booleano como true. Somente se precisarmos determinar se a classe existe ou não, o parâmetro booleano é definido como falso.
Declaração:
public Class loadClass (String name, boolean resolve) throws ClassNotFoundException {
defineClass ()
Um método final usado para definir uma matriz de bytes como uma instância de uma classe. No caso de a classe ser inválida, ele lança um ClassFormatError.
Declaração:
classe final protegida defineClass (String name, byte [] b, int off, int len) lança ClassFormatError
findClass (nome da string)
O método findClass é usado para encontrar a classe especificada. Portanto, ele apenas encontra a classe com um nome totalmente qualificado como parâmetro, mas não carrega a classe. O método loadClass () invoca este método se o ClassLoader pai não puder encontrar a classe solicitada. Além disso, se nenhum pai do ClassLoader encontrar a classe, a implementação padrão lança um ClassNotFoundException.
Declaração:
protected Class findClass (String name) lança ClassNotFoundException
Class.forName (nome da string, inicialização booleana, carregador ClassLoader)
Este método é usado para carregar e inicializar a classe. Ele oferece a opção de escolher qualquer um dos ClassLoaders e caso o parâmetro ClassLoader seja NULL, então automaticamente o Bootstrap ClassLoader é usado.
Declaração:
public static Class forName (String name, boolean initialize, ClassLoader loader) lança ClassNotFoundException
getParent ()
O método getParent é usado para retornar o ClassLoader pai para delegação.
Declaração:
public final ClassLoader getParent ()
getResource ()
Como o nome sugere, o método getResource () tentou encontrar um recurso com o nome fornecido. Inicialmente, ele delegará a solicitação ao ClassLoader pai para o recurso. No caso de o pai ser nulo, o caminho do ClassLoader construído na JVM é pesquisado. Agora, se isso falhar, o método invocará findResource (String) para encontrar o recurso, onde o nome do recurso é especificado como uma entrada que pode ser o caminho de classe absoluto ou relativo. Em seguida, ele retorna um objeto URL para ler o recurso ou retorna um valor nulo se o recurso não tiver privilégios adequados para retornar o recurso ou não for encontrado.
Declaração:
public URL getResource (String name)
A seguir, neste artigo sobre ClassLoader em Java, vamos entender o Custom ClassLoader.
ClassLoader personalizado em Java
Os ClassLoaders integrados cuidarão da maioria dos casos em que os arquivos já estão no sistema de arquivos, mas se você quiser carregar as classes do disco rígido local, precisará usar ClassLoaders personalizados.
Criar ClassLoader personalizado
Para criar um ClassLoader personalizado, você precisa estender o ClassLoader classe e substituir o findClass () método:
Exemplo: vamos criar um ClassLoader personalizado que estende o ClassLoader padrão e carrega uma matriz de bytes do arquivo especificado. Consulte o código abaixo.
pacote edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream public class Sample extends ClassLoader {@Override public Class findClass (String samplename) throws ClassNotFoundException {byte [] b = customLoadClassFromFile (samplename) return defineClass (samplename, b, 0, b.length)} byte privado [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.', File. separatorChar) + '.class') byte [] buffer ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () return buffer}}
Com isso, chegamos ao fim deste artigo sobre ClassLoader em Java. Espero que você tenha entendido o que são ClassLoaders em Java, seus métodos, os diferentes tipos de ClassLoaders, etc.
Se você encontrou este artigo sobre “ClassLoader em Java”, verifique o pela Edureka, uma empresa de aprendizagem online confiável com uma rede de mais de 250.000 alunos satisfeitos espalhados por todo o mundo. Estamos aqui para ajudá-lo em todas as etapas de sua jornada, para se tornar um além dessas perguntas da entrevista java, nós criamos um currículo que é projetado para estudantes e profissionais que desejam ser um Java Desenvolvedor.
Tem alguma questão para nós? Mencione isso na seção de comentários deste “ClassLoader em Java ' e entraremos em contato com você o mais rápido possível.