设为首页 加入收藏

TOP

实例分析JVM安全体系:双亲委派、命名空间、保护域、策略(六)
2017-09-30 16:34:44 】 浏览:3993
Tags:实例分析 JVM 安全 体系 双亲 委派 命名 空间 保护 策略
der loader) throws Exception{         if(loader == null) return;         System.out.println("travase classloader:" + loader.toString());         while(loader.getParent() != null){             System.out.println(loader.getParent());             loader = loader.getParent();         }     }     public static void test(ClassLoader loader) throws Exception {         Class<?> clazz = loader.loadClass("com.ice.classloader.LoadedClass");         Object object = clazz.newInstance();     }     public static void testNameSpace(ClassLoader loader) throws Exception {         Class<?> clazz = loader.loadClass("com.ice.classloader.LoadedClass");         Object object = clazz.newInstance();         try{             LoadedClass lc = (LoadedClass) object;         }catch(Exception e){             e.printStackTrace();         }     } }

被加载类LoadedClass的定义如下:

//被加载类
package com.ice.classloader;

public class LoadedClass {

    public LoadedClass() {
        System.out.println("LoadedClass is loaded by: "
                + this.getClass().getClassLoader());

    }

}

(1).双亲委派结果
child加载器会委托father进行加载,若father的加载目录下存在着对应的class文件,则会由 父加载器father进行对应的加载工作(father也会交由AppClassLoader和ExtClassLoader尝试进行加载,但这两个加载 器并不知道如何加载,故而最后会自己尝试进行加载)

当father的加载目录下没有对应的class文件,则会交由child进行加载

(2).命名空间隔离
由于MyClassLoader是通过系统的(应用程序类加载器/类路径加载器加载的),而 LoadedClass是由user加载器所加载的,AppClassLoader加载器是user加载器的父加载器,故由父加载器加载的类 MyClassLoader无法看见子加载器user所加载的LoadedClass类,在MyClassLoader中尝试实例化 LoadedClass类时就会出现如下错误:

对应出错的正是尝试实例化LoadedClass类的那一行

try{
    LoadedClass lc = (LoadedClass) object;
}catch(Exception e){

(3).运行时包
当请求加载一个com.ice.classloader.virus类时,AppClassLoader路径下没有 该类的class文件,那么attaker加载器将会加载这个virus类,并暗示其为com.ice.classloader的一部分,该类想要获取 com.ice.classloader包下被信任类的访问权限。但由于权限检查时,由于该Virus类由attacker加载而非 AppClassLoader加载,故对MyClassLoader受保护成员的访问将会被阻止。

package com.ice.classloader;

public class Virus {

    public Virus() {
        System.out.println("Virus is loaded by: "
                + this.getClass().getClassLoader());
        MyClassLoader cl = (My
首页 上一页 3 4 5 6 7 8 9 下一页 尾页 6/13/13
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇实例探索Class文件 下一篇源码分析:Java堆的创建

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目