设为首页 加入收藏

TOP

Java 类加载的一些理解(四)
2017-04-07 10:26:13 】 浏览:667
Tags:Java 加载 一些 理解
p;                     throw new Error(oops);
                    }
                }
            }
            sclSet = true;
        }
    }


sun.misc.Launcher l = sun.misc.Launcher.getLauncher(); 就在这里使用,但是当我new 一个自定义classLoader的时候,其实这个scl变量已经存在值,这是因为这个是静态变量,在我调用之前已经有别的类调用过了,因此这里有值。


下面是一些练习出现的情况:


出现以下异常:


Exception in thread "main" java.lang.ClassCastException: com.cong.ClassLoaderLK cannot be cast to com.cong.ClassLoaderLK


看起来两个对象一样,为什么不能转换呢,因为加载的时候我把双亲委派的方式破坏了,其实这个两个类是不同的class实例化出来的,虽然是同一份字节文件,但是用了两个不同的classloader来加载就会出现这个问题


我的练习代码:


package com.cong;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;


 


public class ClassLoaderLK extends ClassLoader {
    /**
    * @param args
    */
    public static void main(String[] args) {
//        this.class.getSystemClassLoader();
       
        String ext = "java.ext.dirs";
        System.out.println("java.ext.dirs :\n" + System.getProperty(ext));
        String cp = "java.class.path";
        System.out.println("java.class.path :\n" + System.getProperty(cp));
       
        ClassLoader currentClassloader = ClassLoaderLK.class.getClassLoader();
        ClassLoader c = sun.misc.Launcher.class.getClassLoader();
        System.out.println(c);
        c = System.class.getClassLoader();
        System.out.println(c);
        c = AbcBean.class.getClassLoader();
        System.out.println(c);
        //sun.misc.Launcher$ExtClassLoader@2259e205
       
        //这个地址是你的classpath
        String pp = "E:\\demo\\用 SpringMVC+MyBatis 来搭建网站\\源码\\demo\\target\\classes\\";
        ClassLoaderLK cl = new ClassLoaderLK(currentClassloader, pp);
       
        System.out.println();
        System.out.println("currentClassloader is " + currentClassloader);
        System.out.println();
      String name = "com.cong.AbcBean.class";
      // String name = "java.util.Arrays.class";
     
        name = "com.cong.AbcBean";
       
        String name2 = "com.cong.ClassLoaderLK";
      // name = "java.util.Arrays&

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 4/8/8
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Spring Boot 常用注解 下一篇Java 内存模型简单理解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目