前言
前段时间的国赛考到了这个东西,肉鸡就来总结一下了
reflection in PHP
在php运行的时候,反射可以对类、接口、函数、方法或扩展进行反向工程,此外,还可以取出函数、类和方法中的文档注释。
简单的demo
下面放一个简单的demo,简单看一下反射是怎样实现的1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class test{
private $test = "Ariel";
private $value = "Xi4or0uji";
private function get(){
$this -> test = "Ariel";
return $this->test;
}
private function hello(){
return " hello world";
}
}
$test = new test();
//获得方法的返回值
$ref = new ReflectionClass($test);
$method = $ref->getMethod("hello");
//setAccessible可以执行私有或保护方法
$method -> setAccessible(true);
print $method -> invoke($test)."<br>";
//获得成员变量的名和值
$reflect = new ReflectionClass($test);
$props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PRIVATE | ReflectionProperty::IS_PROTECTED);
foreach ($props as $prop){
$prop->setAccessible(true);
print $prop->getName()."<br>";
print $prop->getValue($test)."<br>";
}
回显1
2
3
4
5hello world
test
Ariel
value
Xi4or0uji
CTF题目
reflection in JAVA
java的反射跟php的反射很相似,想解剖一个类,先要获取到这个类的字节码文件对象,使用的是Class类中的方法,因此我们要先获取到每一个字节码文件对应的Class类型的对象
简单的demo
下面还是一个简单的demo去说明怎么调用1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33//Member.java文件
package com.company;
public class Member {
public void show(String s){
System.out.println("hello " + s);
}
}
//Test.java文件
package com.company;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception{
// 获取Class对象
Class stuClass = Class.forName("com.company.Member");
// 获得所有公有方法
System.out.println("get public function");
stuClass.getMethods();
Method[] methodArray = stuClass.getMethods();
for (Method m : methodArray){
System.out.println(m);
}
// 通过反射调用Student下的show方法
Method m = stuClass.getMethod("show", String.class);
System.out.println(m);
//实例化一个Student对象
Object obj = stuClass.getConstructor().newInstance();
m.invoke(obj, "Ariel");
}
}
然后我们就能看到成功调用了
反射调出计算器
1 | package com.company; |
参考
https://www.php.net/manual/zh/intro.reflection.php
https://aluvion.github.io/2019/04/25/%E5%8F%8D%E5%B0%84/
http://pupiles.com/java_unserialize2.html