`

ClassLoader的loadClass方法源码浅析

    博客分类:
  • Java
 
阅读更多
protected synchronized Class<?> loadClass(String name, boolean resolve)
	throws ClassNotFoundException
    {
	// First, check if the class has already been loaded
	Class c = findLoadedClass(name);
	if (c == null) {
	    try {
		if (parent != null) {
		    c = parent.loadClass(name, false);
		} else {
		    c = findBootstrapClassOrNull(name);
		}
	    } catch (ClassNotFoundException e) {
                // ClassNotFoundException thrown if class not found
                // from the non-null parent class loader
            }
            if (c == null) {
	        // If still not found, then invoke findClass in order
	        // to find the class.
	        c = findClass(name);
	    }
	}
	if (resolve) {
	    resolveClass(c);
	}
	return c;
    }


用loadClass指定二进制名称加载类的步骤:

findLoadedClass - parent.loadClass - findClass

首先是findLoadedClass(),如果类已经被JVM加载并初始化则返回此类的Class对象,否则,判定是否有父类加载器,有则通过父类加载器loadClass(),无则使用jvm内置类加载器findBootstrapClassOrNull(name)。
若通过父类加载器都无法找到Class类对象,则使用findClass()方法。findClass若要使用,鼓励在子类中重新,而不是直接调用。

附加一段java reflection in action原话:
Java programmers are strongly encouraged to override findClass rather than
loadClass, because the implementation of  loadClass defined by  ClassLoader
supports the delegation model. It is possible to override  loadClass, but this is
bad form.
分享到:
评论

相关推荐

    关于Classloader的总结!loadClass的分析和加载细节的分析

    这篇博文主要围绕`Classloader`的`loadClass`方法进行深入探讨,并分析了类加载的细节。我们将通过以下几点来详细解析这个主题: 1. **类加载器的层次结构** Java中的类加载器通常遵循双亲委托模型。当一个类加载...

    探索JVM底层奥秘ClassLoader源码分析与案例讲解

    在源码层面,ClassLoader的加载过程主要体现在`loadClass()`方法。这个方法会首先尝试从已加载的类中查找,如果没有找到,则会委托给父类加载器进行加载。这就是著名的"双亲委派模型"。这种模型保证了系统类的唯一性...

    classloader源码

    自定义`ClassLoader`通常需要重写`loadClass()`方法。这个方法首先会检查该类是否已经被加载过,如果未加载,则会递归地调用父类加载器的`loadClass()`方法,直到找到合适的加载器或抛出`ClassNotFoundException`。...

    使用classloader动态加载Class

    自定义ClassLoader需要重写`findClass()`或`loadClass()`方法。`loadClass()`方法是类加载的入口,它会调用`findClass()`来查找指定类的字节码。一旦找到,使用`defineClass()`方法将字节码转换为Class对象。 2. **...

    classloader 加密解密应用程序 ,反编译class

    它的主要职责是根据类的全名(包括包名)找到对应的`.class`文件,并将其转换为字节码,然后加载到JVM中。Java的动态加载机制使得我们可以在运行时加载和卸载类,这是Java平台的一大特点。 在`ClassLoader`的层次...

    ClassLoader

    public Class&lt;?&gt; loadClass(String name) throws ClassNotFoundException { // 重写loadClass方法 try { String filename = name.substring(name.lastIndexOf(".") + 1) + ".class"; // 获取类文件名 ...

    自定义classloader的使用

    创建自定义Classloader需要继承java.lang.ClassLoader类,并重写其关键方法,如`findClass(String name)`或`loadClass(String name)`。这两个方法分别用于查找指定类的字节码和实际加载类。在`findClass`中,我们...

    ClassLoader 案例

    在自定义ClassLoader时,主要需要覆写两个关键方法:`findClass()` 和 `loadClass()`。`loadClass()` 方法通常用于委托父类加载器加载类,如果父类加载器无法加载,再由当前类加载器尝试加载。`findClass()` 方法则...

    Tomcat 5.0.18 ClassLoader source code insight

    在分析Tomcat ClassLoader源码时,我们还可以关注到`findClass()`方法,它是`loadClass()`的补充,负责从本地类路径加载类。此外,`resolveClass()`方法则用于将二进制字节码转换为`java.lang.Class`对象。 总的来...

    ClassLoader总结

    开发者可以继承ClassLoader并重写其loadClass方法,以实现自定义的加载逻辑,例如从数据库或网络中加载类。 在实际开发中,自定义ClassLoader有多种应用场景。例如,在模块化开发中,每个模块可能有自己的...

    Java ClassLoader学习总结

    ClassLoader 中的 loadClass 方法是加载类的核心方法,该方法首先检查该 name 指定的 class 是否有被加载,如果没有加载,则委托它的双亲 ClassLoader 进行加载,只有当双亲 ClassLoader 无法加载成功后,才会由自己...

    Java ClassLoader定制实例

    在这个项目中,我们可以创建一个新的ClassLoader类,覆盖其`loadClass()`方法,实现我们的加载逻辑。我们可能需要读取自定义的位置(比如本地文件系统、网络或数据库)来获取类的字节码,然后使用`defineClass()`...

    ClassLoader小例子

    - 自定义ClassLoader通常需要重写`loadClass()`方法,该方法在找不到类时调用`findClass()`进行实际的加载操作。 - 在`ClassLoaderDemo`这个例子中,可能就展示了如何创建一个自定义的ClassLoader,从非标准位置...

    ClassLoader的 一些测试

    自定义加载器通常需要重写`loadClass(String className)`方法,通过URL读取类的字节流并转换为Class对象。在这个过程中,我们需要注意类的缓存,避免重复加载,以及处理好与双亲委派模型的关系。 在进行ClassLoader...

    resolver_java_wsdl.jar

    at java.lang.ClassLoader.loadClass(ClassLoader.java:667) at com.ibm.ws.bootstrap.ExtClassLoader.loadClass(ExtClassLoader.java:119) at java.lang.ClassLoader.loadClass(ClassLoader.java:650) at ...

    理解Java ClassLoader机制

    自定义ClassLoader需要继承`java.lang.ClassLoader`类,并重写`findClass()`或`loadClass()`方法。通过这两个方法,你可以控制类的加载来源和方式。 在实际开发中,理解ClassLoader机制可以帮助解决一些问题,例如...

Global site tag (gtag.js) - Google Analytics