Java implémente un chargeur de classe personnalisé
各类加载器虽然以父子相称,但是没有继承关系
(视频教程推荐:java课程)
点入ClassLoader的源码查看样例:
* <blockquote><pre class="brush:php;toolbar:false"> * class NetworkClassLoader extends ClassLoader { * String host; * int port; * * public Class findClass(String name) { * byte[] b = loadClassData(name); * return defineClass(name, b, 0, b.length); * } * * private byte[] loadClassData(String name) { * // load the class data from the connection * . . . * } * } *
只需继承CalssLoader,重写 findClass方法即可:
package reflect; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; public class MyClassLoader extends ClassLoader{ // 用于保存加载的文件的大小 private int classSize; // 新增的类加载路径 private static List<String> paths = new ArrayList<>(); static { paths.add("D:\\Users\\jeff.chan\\Desktop\\"); } // 默认会将app类加载器做为该类加载器的父加载器 public MyClassLoader() { } public MyClassLoader(ClassLoader parent) { super(parent); } @Override protected Class<?> findClass(String name) throws ClassNotFoundException { byte[] b = loadBinaryData(name); // 打印执行标记 System.out.println("use custom classloader..."); return defineClass(name, b,0, classSize); } public byte[] loadBinaryData(String name) throws ClassNotFoundException{ String pathName = name.replaceAll("\\.", "/"); File file = null; for (String path : paths) { file = new File(path+pathName+".class"); if(file.exists() && file.isFile()){ break; } } if(file==null || !file.isFile()){ throw new ClassNotFoundException(); } // 读取文件的二进制信息 try (InputStream in = new FileInputStream(file)){ // 一般这个大小够了,这里是为了方便读取 // 文件的内容,所以一次性读入,并且将大小返回 // 用于defineClass byte[] b = new byte[1024 * 1024 * 10]; classSize = in.read(b); return b; }catch (IOException ioException){ ; } return null; } }
这里加入了一个MyClassLoader自定义类加载器,扫描的路径为:
D:\\Users\\jeff.chan\\Desktop\\
那么新加入的类加载器就和app类加载器,扩展类加载器,启动类加载器一起起作用。
测试用例:
package reflect; public class Person { private String name; private String age; public Person() { } public Person(String name, String age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age='" + age + '\'' + '}'; } }
客户端:
package reflect; public class Client { public static void main(String[] args) throws Exception { MyClassLoader classLoader = new MyClassLoader(); Class<?> aClass = classLoader.loadClass("reflect.Person"); System.out.println(aClass); System.out.println(aClass.getClassLoader()); } }
时直接运行代码:那么会输出
class reflect.Person
sun.misc.Launcher$AppClassLoader@18b4aac2
发现自己的类加载器根本不起作用。其实是因为双亲委托机制:
1、MyClassLoader 查看是否已经加载 -》 2、App类加载查看是否已经加载 -》3、 扩展类加载器查看是否已经加载
-》 4、启动类加载器查看是否已经加载,没有加载就尝试加载 -》 5、扩展类尝试加载 -》 6、app类加载尝试加载 -》 7、MyClassLoader尝试加载 -》 8、抛出找不到类的异常
上述的流程中,第6步会找到对应的类,所以就直接返回了,根本没有给MyClassLoader机会加载,所以才没有调用自定义的类加载器MyClassLoader。
如果想要加载的话,那么就到编译生成的Person.class移动到桌面reflect/Person.class下,执行结果:
use custom classloader...
class reflect.Person
reflect.MyClassLoader@135fbaa4
结果发现,自定义的类加载起作用了,其实就是上述的流程中的第7步,找到了相应的类的二进制文件,加载了进来。
相关推荐:java入门
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

AI Hentai Generator
Générez AI Hentai gratuitement.

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 du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

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
