Java基础
JAVA 反射 什么是java的反射 java反射就是在程序运行状态中,能够知道任何一个类的所有属性和方法,并且能够调用这些属性和方法的功能 正向 VS 反向 正向流程: 导入类 –> new对象 –> 调用对象 User user = new User(); user.login(); 如果类不存在就报错 **反向流程:**拿到字符串类名 –> 让JVM去找这个类 –> 强行拆解这个类 –> 调用里面的东西 Class.forName("com.User").getMethod("login").invoke(obj); 动态加载类,即使编译时类还没有也能运行 类加载机制 什么是类加载 java代码进行编译后就是.class文件(字节码),类加载就是把这些二进制数据读进内存,解析并生成一个java.lang.Class对象的过程 类加载的三个阶段 Loading(加载) 读取字节流,不执行代码 Linking(链接) 分为验证,准备,解析。 一般不执行代码 lnitialization(初始化) 执行静态代码块,静态变量的赋值动作 两种攻击方式: 例子: class Evil { // 1. 静态变量赋值 public static int a = runCommand(); // 2. 静态代码块 static { System.out.println("静态代码块被执行了"); } public static int runCommand() { System.out.println("静态变量赋值触发了恶意方法!"); return 1; } } 会会先执行赋值,然后是静态代码块。因为初始化执行的顺序是 “静态变量赋值” 和 “静态代码块” ...