java反射
什么是java反射
Java反射是Java的一种特性,它可以让程序在运行时获取自身的信息,并且动态地操作类或对象的属性、方法和构造器等。Java反射指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法;对于给定的一个对象,都能够调用它的任意一个属性和方法。这种动态获取类的内容以及动态调用对象的方法称为反射机制。
反射在反序列化漏洞中的应用:
定制需要的对象
通过invoke调用除了同名函数以外的函数
通过Class类创建对象,引入不能序列化的类
Java反射机制
获取Class对象的四种方式
java.lang.Class
类是反射的基础,存放对应对象的运行时的信息。在Java程序运行时,JVM为所有类型维护一个java.lang.Class
对象,即每种类型的Class对象只有一个。Class对象是我们进行反射操作的入口:
1 |
|
1 |
|
1 |
|
1 |
|
在Class对象中一般有三类信息:构造方法Constructor、成员方法Method、成员变量Field。
获取构造方法Constructor
Class类中用于获取构造方法:
Constructor<?>[] getConstructors()
返回所有公共构造方法对象的数组(只能获取public的构造方法)
Constructor<?>[] getDeclaredConstructors()
返回所有构造方法对象的数组(所有构造方法,包含private)
Constructor<T> getConsturctor(Class<?>... parameterTypes)
返回单个指定的公共构造方法
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
返回单个指定的构造方法
带declared
的方法和不带declared
的方法的区别:
不带
Declared
的方法支持取出包括继承、公有(Public) 但不包括有(Private)的构造函数带
Declared
的方法是支持取出包括公共(Public)、保护(Protected)、默认(包)访问和私有(Private)的构造方法,但不包括继承的构造函数T newInstance(Object... initargs)
根据指定的构造方法创建对象setAccessible(boolean flag)
设置是否取消访问检查,设置为 true 表示取消访问检查,可以提高反射效率
获取成员变量Field
Class类中用于获取成员变量的方法:
Field[] getFields()
返回此类和父类中所有public
的成员变量Field[] getDeclaredFields()
返回此类中所有的成员变量,不包括父类FIeld getField(String name)
从此类和父类中查找对应的public
成员变量并返回Field getDeclaredField(String name)
在此类中查找指定的成员变量并返回
Field 类中用于设置和获取成员变量的方法:
void set(Object obj, Object value)
设置 obj 对象中的此成员变量设置为 value
Object get(Object obj)
获取 obj
对象中的此成员变量String getName()
获取此成员变量的名称Class<?> getType()
获取此成员变量的类型int getModifiers()
获取此成员变量的修饰符(即 private volatile
之类的),通过 Modifier
类方便查询
获取成员方法Method:
Class 类中用于获取成员变量的方法:
Method[] getMethdos()
返回所有 public
成员方法的对象,包括继承的Method[] getDeclaredMethods()
返回此类中所有成员方法对象的数组Method getMethod(String name, Class<?>... parameterTypes)
查找此类及父类中指定的 public
成员方法Method getDeclaredMethod(String name, Class<?>... parameterTypes)
查找并返回单个成员方法
Method 类中的常用方法:
Object invoke(Object obj, Object... args)
调用 obj
对象上的这个方法Class getReturnType()
返回这个方法的返回值类型Type getGenericReturnType()
返回这个方法的泛型返回值类型Class[] getParameterTypes()
返回这个方法的参数类型Type[] getGenericParameterTypes()
返回这个方法的参数的泛型信息Annotation[] getAnnotations()
返回这个方法上的注解
其他:
当我们要获取私有构造方法、成员方法、成员变量时要修改权限。
1 |
|
示例:
1 |
|
1 |
|