关于 Robot.class.getClassLoader()

来源:6-7 loadClass和forName的区别

jaymie

2021-01-05

Robot.class.getClassLoader() 这个语句执行出来的结果是 null,好奇怪啊。这个真的执行了 loadClass吗?感觉没有啊


我用了另一种方式

  ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();

  这里的 contextClassLoader 是 AppClassLoader

  然后再用 contextClassLoader.loadClass  去加载 Robot,然后打断点进去


看下我的代码,我限制行了 getClassLoder,

http://img.mukewang.com/szimg/5ff47b150977aed309880216.jpg

然后loadClass的断点进去,发现这里 findLoadedClass是null

http://img1.sycdn.imooc.com/szimg/5ff47b050979323110060274.jpg

写回答

1回答

翔仔

2021-01-07

同学好,第一个问题,不是null,你可以直接打印

public class LoadDifference {
    public static void main(String[] args) {
        ClassLoader cl = Robot.class.getClassLoader();
        System.out.println(cl);
    }
}

就会发现 cl是sun.misc.Launcher$AppClassLoader@4921a90  类似这种

然后其次,你可以用调试的方式执行,在ClassLoader.class 的 loadClass 设置一个断点,就会妨碍西安,当调用Robot.class.getClassLoader()的时候,会执行loadClass的方法,再通过调试堆栈能看到调用它的地方

1
0

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8427 学习 · 1870 问题

查看课程