Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
loutongtong opened this issue Oct 27, 2020 · 0 comments

Comments

@loutongtong
Copy link

打破双亲委派机制的方法 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant