JVM安全机制之双亲委派机制

首先我们要知道jvm双亲委派机制的核心观念是为了保证代码安全,避免恶意植入代码,我们都知道java程序为我们提供了很多jar包,这些jar包中有我们要用到的一些东西,比如说我们的引用类型String,都知道是在rt.jar包下的java.lang中,那如果我自己写一个java.lang的包并写一个String类然后在内部做一些小变动,会不会你们在使用String的时候用到我所写的这个类而非rt.jar提供的呢?,接下来我们做一个实验:

1.写一个java.lang的包并创建String类并写Tostring方法

JVM安全机制之双亲委派机制_第1张图片 2.这样我们就做到了同包同名的效果,接下来我们来测试一下看是否可以调用到我们的方法

JVM安全机制之双亲委派机制_第2张图片

 结果却出现了一个非常不可思议的错误,这个错误告诉我们,java.lang.string中找不到main方法,这怎么可能我们明明写了main却无法调用,实际上我们在执行的时候压根就没有执行到我们写的这个String类,他执行的是在rt,jar包下的String方法:

JVM安全机制之双亲委派机制_第3张图片

JVM安全机制之双亲委派机制_第4张图片

 这才是本尊,而为什么没有执行到我们写的这个方法呢,是因为jvm的类加载器有一个执行顺序的过程是这样的:

1.app应用程序加载器-->2.exc扩展类加载器--->3.boot启动类加载器(最终执行)

 而我们的String类就是在启动类加载器中所以他会先往上走,然后发现boot中有这个类,那么他就会执行我们根加载器中的String,那么如果根加载器中没有这个类他会怎么执行呢,答案是它会反着往回走,那个里面有就先执行那个:

1..boot启动类加载器--->2.exc扩展类加载器--->3app应用程序加载器(往回走,那个里面有我们的类就执行那个)

给大家用idea实现一下:

注意!自己建的类所在的包不能与根加载器或扩展类加载器中的包名重复

我定义一个car类

JVM安全机制之双亲委派机制_第5张图片

 然后输出一句话,并查看他的加载器

JVM安全机制之双亲委派机制_第6张图片

JVM安全机制之双亲委派机制_第7张图片

可以看出来他用的加载器就是app应用程序加载器,因为当他执行的时候一步一步得找,发现根加载器中没有我们的car,然后又去扩展类加载器中找发现也没有,他就会走我们当前应用加载器了。 

我们也可以这样理解. AppClassLoader 向上委托了两次,即“双”,“亲”代表亲人的意思,或者直接理解成父委派模型(Parents Delegation Model)

以上就是我们今天的内容,双亲委派机制是相对来说比较好理解一点的安全机制,结合这篇文章的内容,希望能帮助到家。

你可能感兴趣的:(jvm,java,linux)