javaJVM-自定义类加载器-创新互联

自定义文件系统类加载器

成都创新互联是一家集网站建设,武鸣企业网站建设,武鸣品牌网站建设,网站定制,武鸣网站建设报价,网络营销,网络优化,武鸣网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
public class Loader extends ClassLoader{
    private String rootDir;

public Loader(String rootDir)
{
    this.rootDir=rootDir;
}

//重写父类方法
protected Class findClass(String name) throws ClassNotFoundException{

    Class c=findLoadedClass(name); //查找已经被加载的类,返回Class类的实例

    //不为空则返回已经加载过的类
    if(null!=c)
    {
        return c;
    }else  //如果没有类,让父类去加载
    {
        ClassLoader parent =this.getParent();
        try {
        c=parent.loadClass(name);   //委派父类加载
        }catch(Exception e)
        {
            e.printStackTrace();
        }
        if(c!=null)
        {
            return c;
        }else   //如果还没获取,则读取d:/myjava/cn/sxt/in/User.class下的文件,转换成字节数组
        {
            byte[] classData=getClassData(name);
            if(classData==null)
            {
                throw new ClassNotFoundException(); //如果没加载到,手动抛出异常
            }else
            {
                c=defineClass(name,classData,0,classData.length);
            }
        }
    }
    return c;
}

    private byte[] getClassData(String classname)
{
    String path=rootDir+"/"+classname.replace('.', '/')+".class";
    ByteArrayOutputStream bos=null;
    InputStream is=null;
    try {
        is=new FileInputStream(path);
        bos=new ByteArrayOutputStream();
        byte[] buffer=new byte[1024];
        int len=-1;
       while((len=is.read(buffer))!=-1)
        {
            bos.write(buffer,0,len);
        }
        bos.flush();
        return bos.toByteArray();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }finally {
        try { if(null!=is)
            {
             is.close();
            }
        }catch(IOException e)
        {
            e.printStackTrace();
        }
         try
         {
             if(null!=bos)
             {
                 bos.close();
             }
         }catch(IOException e)
         {
             e.printStackTrace();
         }

    }
    return null;
}
}

加载:

public class Tt {

public static void main(String[] args) throws Exception {

    Loader loader=new Loader("d:myjva");
    Loader loader2=new Loader("d:myjva");
    Class c=loader.loadClass("cn.sxt.in.HelloWorld");
    Class c2=loader.loadClass("cn.sxt.in.HelloWorld");
    Class c3=loader2.loadClass("cn.sxt.in.HelloWorld");
    Class c4=loader2.loadClass("java.lang.String");
    Class c5=loader2.loadClass("cn.sxt.in.helloworld"); //调用项目下的文件
    //加载器不一样加载相同类会被JVM认为是不同类
    System.out.println(c.hashCode());
    System.out.println(c2.hashCode());
    System.out.println(c3.hashCode());
    System.out.println(c4.hashCode());
    System.out.println(c3.getClassLoader());  //返回自定义的加载器
    System.out.println(c4.getClassLoader()); //用的引导类加载器,返回null
    System.out.println(c5.getClassLoader()); //返回的是应用类加载器
}
}

cmd:编译java文件

C:\Users\10853>d:

D:\>cd myjava

D:\myjava>javac -d . HelloWorld.java

D:\myjava>java cn.sxt.in.HelloWorld
aa

D:\myjava>

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文名称:javaJVM-自定义类加载器-创新互联
分享地址:http://scyanting.com/article/cejosc.html