在Java语言里面提供有一个系统的环境变量:CLASSPATH,这个环境变量的主要作用就是在JVM启动的时候进行类加载路径的定义,在JVM里面可以根据类加载器进行指定路径中类的加载(找到了类的加载器就找到了类的来源)
类加载器在加载之后的结果在程序中都是用字节(byte)来描述。
要想获得类的加载器要通过ClassLoader来获取,而要想获取ClassLoader就必须通过Class类(反射的根源)实现:
public ClassLoader getClassLoader();
当获取了ClassLoader之后,还可以继续获取其父类的ClassLoader类对象:
public final ClassLoader getParent();
类加载之后会保存到JVM的内存之中,而内存中的类要使用对象来描述,对象是通过Class类的反射来操作,而通过反射也可以获取ClassLoader对象
代码实现:
class Message{ } public class MAIN { public static void main(String[] args) { Class<? extends Message> messageClass = Message.class; System.out.println(messageClass.getClassLoader()); // 获取当前类加载器 System.out.println(messageClass.getClassLoader().getParent()); // 获取父类加载器 System.out.println(messageClass.getClassLoader().getParent().getParent()); // 获取父类的父类加载器;返回为空 } }
结果:
jdk.internal.loader.ClassLoaders$AppClassLoader@63947c6b jdk.internal.loader.ClassLoaders$PlatformClassLoader@776ec8df null
所有的类加载器都是由上向下执行的(系统类加载器是看不见的)
当获得了类加载的时候,就可以使用类加载来实现类的反射加载处理。
清楚了类加载器的结构之后就可以进行自定义的类加载器的使用,有一点需要记住的就是自定义类加载器是在所有系统类加载器的最后。
系统类中提供的类加载器都是根据CLASSPATH路径进行类加载的,而如果拥有了自定义的类加载器就可以由自己任意指定类的加载位置,比如从磁盘的某个位置或者某个服务器的某个位置上加载,可以灵活地改变加载位置以达到灵活开发的目的,加载后会得到一个字节数组,从而使用加载的类。
实现步骤:
1、将一个随便编写的程序类保存在磁盘上:
public class Message { public void send(){ System.out.println("【发送消息】www.baidu.com"); } }
未完待续。。。