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