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 例子-类(用于理解的)
# 例如现在有一个 Foo类# 请实例化它并调用 print() 方法package 反射;class Foo {void print() {System.out.println("foo的print方法冲冲冲");}}
0x03.2 使用例子
package 反射;public class Test {public static void main(String[] args) {Class fooClass3 = null;try {fooClass3 = ClassLoader.getSystemClassLoader().loadClass("反射.Foo");} catch (ClassNotFoundException e) {e.printStackTrace();}try {Foo foo = (Foo) fooClass3.newInstance();foo.print();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}}# 运行结果foo的print方法冲冲冲进程已结束,退出代码 0
