JavaSE进阶

14.3 类的加载与ClassLoader的理解

14.3.1 了解:类的加载过程

当程序主动使用某个类时,如果该类还未被加载到内存中,则系统会通过如下三个步骤来对该类进行初始化。

14.3.2 了解:ClassLoader

类加载器是用来把类(class)装载进内存的。JVM 规范定义了两种类型的类加载器:启动类加载器(bootstrap)和用户自定义加载器(user-defined class loader)。 JVM在运行时会产生3个类加载器组成的初始化加载器层次结构 ,如下图所示:

  • //1.获取一个系统类加载器
  • ClassLoader classloader = ClassLoader.getSystemClassLoader();
  • out.println(classloader);
  • //2.获取系统类加载器的父类加载器,即扩展类加载器
  • classloader = classloader.getParent();
  • out.println(classloader);
  • //3.获取扩展类加载器的父类加载器,即引导类加载器
  • classloader = classloader.getParent();
  • out.println(classloader);
  • //4.测试当前类由哪个类加载器进行加载
  • classloader =
  • forName("exer2.ClassloaderDemo").getClassLoader();
  • out.println(classloader);
  • //5.测试JDK提供的Object类由哪个类加载器加载
  • classloader =
  • forName("java.lang.Object").getClassLoader();
  • out.println(classloader);
  • //*6.关于类加载器的一个主要方法:getResourceAsStream(String str):获取类路径下的指定文件的输入流
  • InputStream in = null;
  • in = this.getClass().getClassLoader().getResourceAsStream("exer2\\test.properties");
  • out.println(in);

14.4 创建运行时类的对象

[问] 有了Class对象,能做什么?

创建类的对象:调用Class对象的newInstance()方法

要  求:

1)类必须有一个无参数的构造器。

2)类的构造器的访问权限需要足够。

难道没有无参的构造器就不能创建对象了吗?

不是!只要在操作的时候明确的调用类中的构造器,并将参数传递进去之后,才可以实例化操作。步骤如下:

1)通过Class类的getDeclaredConstructor(Class … parameterTypes)取得本类的指定形参类型的构造器

2)向构造器的形参中传递一个对象数组进去,里面包含了构造器中所需的各个参数。

3)在Constructor类中存在一个方法:

 Public T newInstance(Object ... initargs);

以上是反射机制用的最多的地方

//1.根据全类名获取对应的Class对象

String name = “atguigu.java.Person";

Class clazz = null;

clazz = Class.forName(name);

//2.调用指定参数结构的构造器,生成Constructor的实例

Constructor con = clazz.getConstructor(String.class,Integer.class);

//3.通过Constructor的实例创建对应类的对象,并初始化类属性

Person p2 = (Person) con.newInstance("Peter",20);

System.out.println(p2);