黑马程序员_Java虚拟机的学习

来源:互联网 发布:淘宝怎样设置货到付款 编辑:程序博客网 时间:2024/05/23 11:53

-----------------------------android培训java培训期待与您交流!----详细请查看:http://edu.csdn.net/heima---------------



JVM

1.    ClassLoader(类加载器)

2.    JVM 提供了三种类加载器

1)  根类加载器(使用C++编写,程序员无法在 Java 代码中获得该类)

2)  扩展加载器,使用 Java 代码实现

3)  系统加载器(应用加载器) ,使用Java 代码实现

3.    用户自定义的类加载器都是 java.lang.ClassLoader 的子类

4    调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化。例如:

package com.shengsiyuan.classloader;

class CL

{

       static

       {

              System.out.println("Class CL");

       }

}

public class Test7

{

       publicstatic void main(String[] args) throws Exception

       {

              // 获得系统类加载器

              ClassLoader loader =ClassLoader.getSystemClassLoader();

              Class<?>clazz = loader.loadClass("com.shengsiyuan.classloader.CL");//加载类

//调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化,

             

              System.out.println("----------------------------");

              clazz =Class.forName("com.shengsiyuan.classloader.CL");//给类实例化

       }//此时 是对类的主动使用,返回一个类的实例,会导致类的初始化。不在用New对象

结果是:

-------------------

Class CL

5  父子加载器并非继承关系,也就是说子加载器不一定是继承了父加载器。是一种组合的关系。除了以上虚拟机自带的加载器外,用户可以自定义加载器(User-defined Class Loader),Java提供了抽象类java.lang.ClassLoader,所有的用户自定义的类加载器应继承ClassLoader类。

 

6 当生成一个自定义的类加载器实例时,如果没有指定它的父加载器,那么系统类加载器就将成为该类加载器的父加载器。

7

自定义一个加载器

 

 

public class MyClassLoader extendsClassLoader

{

       privateString name; //类加载器的名字

       privateString path = "d:\\"; // 加载类的路径

       privatefinal String fileType = ".class"; // class文件的扩展名

       publicMyClassLoader(String name)

       {

              super(); // 让系统类加载器成为该类加载器的父加载器

              his.name = name;

       }

      

       publicMyClassLoader(ClassLoader parent, String name)

       {

              super(parent); // 显式指定该类加载器的父加载器

              this.name = name;

       }

      

       @Override

       publicString toString()

       {

              return this.name;

       }

 

       publicString getPath()

       {

              return path;

       }

 

       publicvoid setPath(String path)

       {

              this.path = path;

       }

      

       @Override

public Class<?>findClass(String name) throws ClassNotFoundException//按指定方式将一个字节数组转化字节对象。返回一个class对象。

       {

              byte[] data = this.loadClassData(name);

              return this.defineClass(name, data, 0,data.length);

       }

      

       privatebyte[] loadClassData(String name)

       {

              InputStream is = null;

              byte[] data = null;

              ByteArrayOutputStream baos = null;

             

              try

              {

                     this.name= this.name.replace(".", "\\");

                     is= new FileInputStream(new File(path + name + fileType));

                     baos= new ByteArrayOutputStream();

                    

                     intch = 0;

                     while(-1!= (ch = is.read()))

                     {

                            baos.write(ch);

                     }

                     data= baos.toByteArray();

              }

              catch(Exception ex)

              {

                     ex.printStackTrace();

              }

              finally

              {

                     try

                     {

                            is.close();

                            baos.close();

                     }

                     catch(Exceptionex)

                     {

                            ex.printStackTrace();

                     }

              }

             

              return data;

       }

 

 

public static void main(String[] args) throwsException

       {

              MyClassLoader loader1 = new MyClassLoader("loader1");

             

              loader1.setPath("d:\\myapp\\serverlib\\");

             

              MyClassLoader loader2 = newMyClassLoader(loader1, "loader2");

             

              loader2.setPath("d:\\myapp\\clientlib\\");

//           

//            MyClassLoader loader3 = newMyClassLoader(null, "loader3");

//           

//            loader3.setPath("d:\\myapp\\otherlib\\");

//           

//            test(loader2);

//           

//            System.out.println("----------");

//           

//            test(loader3);

             

              Class clazz =loader1.loadClass("Sample");//加载类

              Object object =clazz.newInstance(); //创建一个Sample类的对象,实例

              Sample sample = (Sample)object;//向下类型转换

             

System.out.println(sample.v1);//通过反射可以突破不同的命名空间的限制,加载器加载类。












-----------------------------android培训java培训期待与您交流!----详细请查看:http://edu.csdn.net/heima---------------

原创粉丝点击