学习笔记 Java 反射机制学习

学习笔记 Java 反射机制学习

前言

最近学习Java强化一下基础,学到反射部分发现非常的黑科技,反射可以直接读取类的任何方法和属性,包括私有方法、私有属性,同时还可以直接更改对象的属性,非常的有用,在安全方面也经常用于反序列化漏洞完善利用链部分,特此记录。

环境准备

开始演示,准备一个Person类,构造方法有两个形式参数:name和age,意为名字和年龄,一个公有方法用于返回对象的name和age,还有一个私有方法test()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Person {
String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString(){
return "Person [name=" + name + ", age=" + age + "]";
}
private void test(){
System.out.println("调用了");
}
}

在主类里我们实例化Person类得到一个对象,正常属性为:

1
2
3
4
5
6
public class main {
public static void main(String[] args) {
Person person = new Person("小安", 20);
System.out.println(person);
}
}

result:

1
Person [name=小安, age=20]

利用反射修改对象属性

利用反射修改对象的属性,首先获取类的Class对象,之后直接使用getDeclaredField方法,参数填入属性名,即可直接获取到一个Field属性对象,我们使用set方法直接对其进行修改即可,传入两个参数,第一个person为要修改的对象,第二个参数”老安”是修改后的内容,代码如下:

1
2
3
4
5
6
7
8
9
public class main {
public static void main(String[] args) throws ReflectiveOperationException {
Person person = new Person("小安", 20);
Class<Person> personClass = Person.class;
Field name = personClass.getDeclaredField("name");
name.set(person,"老安");
System.out.println(person);
}
}

result:

1
Person [name=老安, age=20]

举一反三,你可能以为直接用同样的方法修改age属性,但实际上仅仅依靠以上代码是不行的,我们还需要添加一行,使用setAccessible,给name对象赋予权限,代码如下:

1
2
3
4
5
6
7
8
9
10
public class main {
public static void main(String[] args) throws ReflectiveOperationException {
Person person = new Person("小安", 20);
Class<Person> personClass = Person.class;
Field age = personClass.getDeclaredField("age");
age.setAccessible(true);
age.set(person,18);
System.out.println(person);
}
}

result:

1
Person [name=小安, age=18]

利用反射强制执行类方法

利用反射可以直接执行类的私有方法,上面我们有一个私有的方法test(),我们利用反射来强制调用一下试试:

1
2
3
4
5
6
7
8
9
public class main {
public static void main(String[] args) throws ReflectiveOperationException {
Person person = new Person("小安", 20);
Class<Person> personClass = Person.class;
Method test = personClass.getDeclaredMethod("test");
test.setAccessible(true);
test.invoke(person);
}
}

result:

1
调用了

以上就是反射机制可以说是用的最多的两个特色用法,其余的还有例如不用import就实例化类的方法,非常多,反射这个操作在后续反序列化漏洞利用方向有很大的作用,值得深入学习,加油!


学习笔记 Java 反射机制学习
https://www.xiaoan233.com/hello/easy-java/
作者
Xiao_an
发布于
2024年7月8日
许可协议