0x01 前言

在java中一切的java类都必须经过JVM加载以后才能运行,而有了 ClassLoader 以后使得 Java 类可以被动态加载到 Java 虚拟机中并执行。

这个功能在程序员眼中可以更好的扩张业务。
而在搞安全的眼中,它也是一个很好的利用工具,有了它,我们可以加载任意的java类。

因为网上关于这个东西的原理讲的人很多了,而且我都不一定讲的有他们好,所以我就不班门弄斧了。
我这里就简单讲讲如何去使用 ClassLoader,让心里有个底,在后面实战例子中的章节就知道如何去使用了。

0x02 ClassLoader 中与加载类相关的方法

方法 说明
getParent() 返回父类加载器
loadClass(String name) 加载名称为name变量的类
返回的是 java.lang.Class类的实例
findClass(String name) 查找名称为name变量的类
返回的是 java.lang.Class类的实例
findLoadedClass(String name) 查找名称为name变量已经被加载过的类
返回的是 java.lang.Class类的实例
defineClass(String name, byte[] b, int off, int len) 把字节数组b中的内容转换成 Java 类
返回的结果是 java.lang.Class类的实
resolveClass(Class<?> c) 链接指定的 Java 类

0x03 简单例子

0x03.1 例子-类(用于理解的)

  1. # 例如现在有一个 Foo
  2. # 请实例化它并调用 print() 方法
  3. package 反射;
  4. class Foo {
  5. void print() {
  6. System.out.println("foo的print方法冲冲冲");
  7. }
  8. }

0x03.2 使用例子

  1. package 反射;
  2. public class Test {
  3. public static void main(String[] args) {
  4. Class fooClass3 = null;
  5. try {
  6. fooClass3 = ClassLoader.getSystemClassLoader().loadClass("反射.Foo");
  7. } catch (ClassNotFoundException e) {
  8. e.printStackTrace();
  9. }
  10. try {
  11. Foo foo = (Foo) fooClass3.newInstance();
  12. foo.print();
  13. } catch (InstantiationException e) {
  14. e.printStackTrace();
  15. } catch (IllegalAccessException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. }
  20. # 运行结果
  21. fooprint方法冲冲冲
  22. 进程已结束,退出代码 0