


Présentation des chargeurs de classes Java et du processus de chargement de classes
1. Processus de chargement de classe
Chargement
Grâce au nom complet de la classe (nom du package + nom de la classe), le fichier .class
de la classe est obtenu et chargé dans le métaespace. .class
文件,加载到元空间。
链接
验证:检验
.class
文件的安全性准备:为静态类型变量分配内存并设置默认值
解析:将常量池内的符号引用转换为直接引用,符号引用指向一个未被加载的类,或者未被加载类的字段或方法,那么解析将触发这个类的加载
初始化
执行类的构造器方法init
()的过程,若该类具有父类,jvm
会保证父类的init
先执行,然后在执行子类的init
。
2. 类加载器
启动类加载器
启动类加载器是由C/C++语言实现的,用来加载Java核心类库。启动类只加载包名为:java、javax、sun开头的类
扩展类加载器
父类加载器为启动类加载器
。加载以下两个目录中的类库:
java.ext.dirs
目录JDK安装目录:
jre/lib/ext
目录
我们就可以将我们自己的包放在以上目录下,就会自动加载进来了。
应用类加载器
父类加载器为启动类加载器
,负责加载环境变量classpath
或者系统属性java.class.path
指定路径下的类库,是程序中默认的类加载器,我们Java程序中的类,都是由它加载完成的。
自定义类加载器
继承java.lang.ClassLoader
类,重写findClass()方法 。如果没有太复杂的需求,可以直接继承URLClassLoader
类,重写loadClass
方法。
作用
加密:Java代码可以轻易的被反编译,如果你需要把自己的代码进行加密以防止反编译,可以先将编译后的代码用某种加密算法加密,类加密后就不能再用Java的ClassLoader去加载类了,这时就需要自定义ClassLoader在加载类的时候先解密类,然后再加载。
从非标准的来源加载代码:如果你的字节码是放在数据库、甚至是在云端,就可以自定义类加载器,从指定的来源加载类。
双亲委派模型
jvm对class文件采用的是按需加载的方式,当需要使用该类时,jvm才会将它的class文件加载到内存中产生class对象。在加载类的时候,是采用的双亲委派机制
。
如果一个
类加载器
接收到了类加载
的请求,它自己不会先去加载,会把这个请求委托给父类加载器
去执行。如果父类还存在父类加载器,则继续向上委托,一直委托到
启动类加载器:Bootstrap ClassLoader
如果父类加载器可以完成加载任务,就返回成功结果,如果父类加载失败,就由子类自己去尝试加载,如果子类加载失败就会抛出
ClassNotFoundException
异常,这就是双亲委派模式
打破双亲委派模型
用途:
Java应用中存在着很多服务提供者接口(Service Provider Interface,SPI),这些接口允许第三方为它们提供实现,如常见的 SPI 有 JDBC、JNDI等,这些 SPI 的接口属于 Java 核心库,一般存在rt.jar包中,由Bootstrap类加载器加载。而Bootstrap类加载器无法直接加载SPI的实现类,所以需要反向委派给其他类加载器进行加载
在Tomcat服务器中,存在一个服务器运行多个不同版本但同名服务的需求,所以需要打破双亲委派模型,加载多个同名类。
方法:
使用上下文类加载器
-
重写
LienloadClass
- 🎜 Préparation :Allouez de la mémoire pour les variables de type statique et définissez les valeurs par défaut 🎜🎜
- 🎜Analyse : Convertissez la référence de symbole dans le pool de constantes en une référence directe, et la référence du symbole pointe vers une classe A chargée inutilisée, ou un champ ou une méthode d'une classe déchargée, alors l'analyse déclenchera le chargement de cette classe🎜🎜🎜🎜initialisation🎜🎜exécution de la méthode constructeur de la classe
init code>(). Si la classe A a une classe parent, <code>jvm
veillera à ce que leinit
de la classe parent soit exécuté en premier, puis leinit est exécuté. 🎜🎜2. Chargeur de classe🎜🎜<img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/465/014/168230238935730.png" class="lazy" alt="Le processus de chargement de classe Java et le chargeur de classe sont quoi">🎜🎜Chargeur de classe de démarrage🎜🎜Le chargeur de classe de démarrage est implémenté en langage C/C++ et est utilisé pour charger les bibliothèques de classes de base Java. La classe de démarrage ne charge que les classes dont les noms de package commencent par : java, javax et sun🎜🎜Chargeur de classe étendu🎜🎜Le chargeur de classe parent est <code>Chargeur de classe de démarrage
. Chargez les bibliothèques de classes dans les deux répertoires suivants :🎜- 🎜
java.ext.dirs
Directory🎜🎜🎜Répertoire d'installation JDK : répertoirejre/lib/ext
🎜🎜🎜🎜Nous pouvons placer nos propres packages dans le répertoire ci-dessus et il sera automatiquement chargé. 🎜🎜Chargeur de classe d'application🎜🎜Le chargeur de classe parent est leChargeur de classe de démarrage
, qui est responsable du chargement duchemin de classe de la variable d'environnement
ou de lapropriété système java.class.path La bibliothèque de classes sous le chemin spécifié code> est le chargeur de classe par défaut du programme. Toutes les classes de notre programme Java sont chargées par celui-ci. 🎜🎜Chargeur de classe personnalisé🎜🎜Hérite de la classe <code>java.lang.ClassLoader
et remplace la méthode findClass(). S'il n'y a pas d'exigences trop complexes, vous pouvez directement hériter de la classeURLClassLoader
et remplacer la méthodeloadClass
. 🎜🎜Fonction🎜- 🎜Cryptage : Le code Java peut être facilement décompilé si nécessaire. Le code est crypté pour empêcher la décompilation. Vous pouvez d'abord chiffrer le code compilé avec un algorithme de chiffrement. Une fois la classe chiffrée, vous ne pouvez plus utiliser le ClassLoader de Java pour charger la classe. À ce stade, vous devez personnaliser le ClassLoader lors du chargement de la classe. la classe d'abord, puis chargez-la. 🎜🎜
- 🎜Charger du code à partir de sources non standard : si votre bytecode est placé dans une base de données ou même dans le cloud, vous pouvez personnaliser le chargeur de classes pour charger des classes à partir de sources spécifiées. 🎜🎜🎜🎜Modèle de délégation parentale🎜🎜jvm utilise une méthode de chargement à la demande pour les fichiers de classe Lorsque la classe doit être utilisée, le jvm chargera son fichier de classe en mémoire pour générer un objet de classe. Lors du chargement des classes, le
mécanisme de délégation parentale
est utilisé. 🎜- 🎜Si un
chargeur de classe
reçoit une demande dechargement de classe
, il ne la chargera pas en premier. déléguera cette requête auchargeur de classe parent
pour exécution. 🎜🎜 - 🎜Si la classe parent a toujours un chargeur de classe parent, continuez à déléguer vers le haut jusqu'à ce que
Démarrez le chargeur de classe : Bootstrap ClassLoader
🎜🎜 - 🎜Si le chargeur de classe parent peut Après avoir terminé la tâche de chargement, un résultat réussi sera renvoyé. Si le chargement de la classe parent échoue, la sous-classe essaiera de la charger par elle-même, une exception
ClassNotFoundException
sera levée. Il s'agit dumodèle de délégation parentale
🎜🎜🎜🎜Rompre le modèle de délégation parentale🎜🎜Objectif :🎜- 🎜Application Java Il existe de nombreuses interfaces de fournisseurs de services (Service Provider Interface, SPI), qui permettent à des tiers de fournir des implémentations pour eux. Par exemple, les SPI courants incluent JDBC, JNDI, etc. Ces interfaces SPI appartiennent à la bibliothèque principale Java et existent généralement dans le package rt.jar, chargé par le chargeur de classe Bootstrap. Le chargeur de classe Bootstrap ne peut pas charger directement la classe d'implémentation SPI, il doit donc être délégué à d'autres chargeurs de classe pour le chargement🎜🎜
- 🎜Dans le serveur Tomcat, il est nécessaire qu'un serveur exécute plusieurs versions différentes de services avec le même nom. Par conséquent, il est nécessaire de rompre le modèle de délégation parentale et de charger plusieurs classes avec le même nom. 🎜🎜🎜🎜Méthode : 🎜
- 🎜Utiliser le chargeur de classe contextuelle 🎜🎜
- 🎜Remplacer
loadClass
Méthode 🎜🎜🎜
- 🎜Si un
- 🎜
.class
🎜🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.
