加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 服务器 > 安全 > 正文

学会了实例分析 Java 反射吗

发布时间:2023-10-20 10:50:45 所属栏目:安全 来源:
导读:反射是大多数语言里都必不不可少的组成部分,对象可以通过反射获取他的类,类可以通过反射拿到所有方法(包括私有),拿到的方法可以调用,总之通过“反射”,我们可以将Java这种静态语言附加上动态

反射是大多数语言里都必不不可少的组成部分,对象可以通过反射获取他的类,类可以通过反射拿到所有方法(包括私有),拿到的方法可以调用,总之通过“反射”,我们可以将Java这种静态语言附加上动态特性。

什么是反射

java的反射是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法,并且对于任意一个对象。

基本形式

public void execute(String className, String methodName) throws Exception {

Class clazz = Class.forName(className);

clazz.getMethod(methodName).invoke(clazz.newInstance());

}

上面的例子中,我演示了几个在反射里极为重要的方法:获取类的方法: forName实例例化类对象的方法: newInstance获取函数的方法: getMethod执行函数的方法: invoke。

反射的作用:

让Java具有动态性,修改已有对象的属性,动态生成对象,动态调用方法,操作内部类和私有方法。

在反序列化漏洞中的应用

定制需要的对象,通过invoke调用除了同名函数以外的函数,通过class类创建对象,引入不能序列化的类。

java反射举例

此处引用白日梦组长的例子,具体讲解一下反射。

先写一个Person作为我们下面演示的原型类。

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;

}

}

获取原型类

使用forName方法:

Class c = Class.forName("Person");

在此也写一种基于ClassLoader的动态类加载方式。

this.getClass().getClassLoader().loadClass("Person");

从原型class里面实例化对象

利用构造函数实例化。

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);

我们可以打印一下p1看一下返回结果

获取类里面的属性

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");

获取类方法

Method actmethod = c.getMethod("act",String.class);

actmethod.invoke(p1,"SKyMirror");

getMethod 与上面的获取构造函数类似,第一个参数是函数名,第二个是传参的类型。

invoke方法第一个传入对象,第二个是传入参数值。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章