Skip to content

自定义类加载器com.mashibing.jvm.c2_classloader.T011_ClassReloading1 和 T012_ClassReloading2 #4

@loutongtong

Description

@loutongtong

打破双亲委派机制的方法 1, 重写loadClass()有的结论有问题,当然也跟自定义加载器有关,跟楼上的问题的bug2类似:
T011_ClassReloading1 -> 在只重写findClass方法的基础上,多次调用msbClassLoader.loadClass("com.mashibing.jvm.Hello")方法,因为Hello这个类是被APPClassLoader加载过的,所以不管调用多少次msbClassLoader.loadClass方法,返回的Class都是同一个,而如果调用的是一个全新的、从未被任何加载器加载过的class,结论就不一样了,调用两次msbClassLoader.loadClass方法,如果两次中间不把msbClassLoader重新new,则loadClass返回的class是同一个,如果重新new了,那么两次的load结果返回的Class是不同的;
T012_ClassReloading2 -> 在重写loadClass的基础上,第一次调用m.loadClass("com.mashibing.jvm.Hello")会重新覆盖掉APPClassLoader加载的Hello.class,此时的Hello的加载器会变为m,而m 重新new之后在loadClass,将会再次覆盖,这种情况下,无论被加载的类是否被任何的加载器加载过,只要是新new 的m,调用m.loadClass,都会重新加载一次,重新加载的和之前的class不一样。
总结,在只重写findClass基础上,如果加载的从未加载过的class,同一个加载器加载多少次,返回值都是一个,new的加载器加载的是不同的;在重写loadClass的基础上,同一个加载器加载多少次都是新的,新new的加载器,每次new,每次load都会产生不同的class

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions