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