前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【入坑JAVA安全】JAVA反射机制

【入坑JAVA安全】JAVA反射机制

作者头像
tnt阿信
发布于 2020-08-05 02:57:40
发布于 2020-08-05 02:57:40
1K00
代码可运行
举报
运行总次数:0
代码可运行

0x01 基本概念

Java反射机制是在运行状态时,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。

java反射机制给漏洞利用提供了很多便利,我们可以在很多java漏洞的exp中看到它的影子,所以,学习java安全是绕不开它的。

0x02

前面我们知道了反射机制能够做什么,但是java具体是怎么实现这一点的呢?这几涉及到java中的几个类:Class、Constructor、Method、Field,有过面向对象编程经验的同学都知道,一个类一般是抽象出了某一类事物的特征,例如下面这个Person类就抽象出了一个人的特征,并实现了一些操作这些特征的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Person{
    private String name;
    private int age;
    private  double  height;
    private double  weight;

    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 double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public void show(){
        System.out.println("xxxxxx");
    }
}

那么我们刚刚说的那几个和反射相关的类同样是这样的——Class类抽象出了java中类的特征并提供了一些方法,Constructor抽象出了java中所有的构造函数的特征以及提供一些方法....(最开始接触java安全的时候我就经常会被java的Class类型搞昏)

知道了这几个类之后,我们再回到怎么实现 调用一个对象的任意方法这个问题上来,分三步走:

  1. 首先获得这个对象对应的Class类的实例
  2. 因为Class这个类存储着一个类的所有信息:属性、方法、构造函数....所以我们可以通过Class类的实例来获取你想要调用的那个方法
  3. 拿到了对应的方法过后,我们可以给这个方法传入对应的参数来调用它。

上面是一个大体的流程,现在我们来看一下用代码怎么实现这三个流程:

为了后续更好地阐述,我们以通过反射调用下面这个User类的setName()方法为例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class User{
    private String name;
    private int age;

    @Override
    public String toString(){
        return "User{" + "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;
    }
}

1.获得User对象的Class类实例

有三种方式获得Class类实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.调用Class类的静态方法forName获取某个类的Class类实例:
Class clz = Class.forName("com.axin.User");

2.访问某个类的class属性,这个属性就存储着这个类对应的Class类的实例:
Class clz = com.axin.User.class;

3.调用某个对象的getClass()方法:
Class clz = (new User()).getClass();

2.获取setName方法

我们之前已经提到了Method这个类,java中所有的方法都是Method类型,所以我们通过反射机制获取到某个对象的方法也是Method类型的。通过Class对象获取某个方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
clz.getMethod(方法名,这个方法的参数类型)

例:
Method method = clz.getMethod("setName", String.class);

3.调用setName方法

Method类中有一个invoke方法,就是用来调用特定方法的,用法如下:

第一个参数是调用该方法的对象,第二个参数是一个可变长参数,是这个方法的需要传入的参数,描述的不够直观,直接看代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
接着上文代码:
method.invoke((new User()), "axin");

或者

User user = new User();
method.invoke(user, "axin");

流程走完了,让我们来看看整体程序:

可以看到我们成功调用setName方法,并设置name为“axin”。

0x03

除了调用一个对象的任意方法,我们还可以获得某个对象对应的类名、所有的属性以及所有的方法名,由于这些内容在编写exp中使用较少,就不写在这里了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一个安全研究员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一篇文章全面了解Java反射机制【珍藏】
Java的反射机制在实践中可谓无处不在,如果你已经工作几年,还对Java的反射机制一知半解,那么这篇文章绝对值得你读一读。
程序新视界
2020/03/27
3850
java反射原理简单介绍(java反射机制的应用)
大家好,又见面了,我是你们的朋友全栈君。 前面给大家介绍了一下什么是java反射机制,那么下面要给大家介绍的就是java反射机制的原理,那么它的原理究竟是怎样的呢?下面就通过下面来做一下详细的了解吧。
全栈程序员站长
2022/07/28
4300
java反射机制
Java反射机制是指在运行时,程序可以获取和操作其本身或其他对象的信息的能力。Java反射机制为开发人员提供了许多动态编程的能力,例如创建对象、调用方法、访问成员变量等。
堕落飞鸟
2023/03/31
5470
java反射机制原理剖析
当程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。我们认为java并不是动态语言,但是java有一个非常突出的动态相关机制,俗称:反射。
周陆军博客
2023/04/09
4600
Java反射机制详解
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java团长
2018/08/06
4450
深入探索Java反射机制:解析原理与应用
Java反射机制是一项强大的技术,它允许程序在运行时动态地获取和操作类、对象、方法和属性。本文将深入探索Java反射机制的原理和应用,带您揭开隐藏在代码背后的魔法。我们将从基本概念入手,逐步介绍反射的核心概念、使用方法和常见应用场景。通过学习本文,您将更好地理解Java反射机制,并能够在实际项目中灵活运用。
默 语
2024/11/20
2400
JAVA反射机制及其原理实现
反射就是把java类中的各种成分映射成一个个的Java对象 例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。
张哥编程
2024/12/19
970
JAVA反射机制及其原理实现
Java反射机制详解
对于一般的开发者,很少需要直接使用Java反射机制来完成功能开发,但是反射是很多框架譬如 Spring, Mybatis 实现的核心,反射虽小,能量却很大。
小旋锋
2019/01/21
5990
Java反射机制及其使用
Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
全栈程序员站长
2022/09/08
5650
Java反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
提莫队长
2019/02/21
4060
Java反射机制深度剖析
Java反射机制是Java语言中一种很重要的机制,可能在工作中用到的机会不多,但是在很多框架中都有用到这种机制。我们知道Java是一门静态语言,在程序编译时变量的数据类型都已经确定,那么在Java运行时环境中,对于任意一个类,我们能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java的反射机制(Reflection)。
烂猪皮
2020/11/02
3430
Java反射机制深度剖析
Java反射机制
        JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
sunonzj
2022/06/21
6020
Java反射机制
Java反射机制
JVM有一个运行时数据区,这个运行时数据区分为方法区,堆区和栈区,我们能够通过反射机制获取的class信息就是存储在方法区中的,这里的Class信息是通过.java文件编译成.class文件,然后由类加载器装载运行时数据区时,在方法区中就会产生对应的Class实例。
ruochen
2021/11/24
5690
Java反射机制
编译时类型是在程序代码编译解决确定的类型,而运行时类型是在程序运行时根据实际的对象类型确定的。
月梦@剑心
2023/12/03
1720
Java反射机制详解
1.在运行时,对于一个java类,能否知道属性和方法;能否去调用它的任意方法? 答案是肯定的。
全栈程序员站长
2022/09/28
2570
Java反射机制详解
Java反射机制
JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。
黑洞代码
2021/01/14
3460
Java反射机制
Java反射机制
文章目录 1. Java反射机制 1.1. 前言 1.2. 什么是反射机制 1.3. 主要的类 1.4. Class 1.4.1. 常用的方法 1.4.2. 获取Class的对象并且实例化 1.5. Constructor 1.5.1. 常用的方法 1.6. Method 1.6.1. 常用的方法 1.7. Field 1.7.1. 常用方法 1.8. Modifier 1.8.1. 常用的方法 1.8.2. 实例 1.9. 使用 1.9.1. 实例化对象 1.9.2. 成员方法的操作 1.9.3. 成
爱撒谎的男孩
2019/12/31
1.1K0
Java反射全解析
正常情况下,我们知晓我们要操作的类和对象是什么,可以直接操作这些对象中的变量和方法,比如一个User类:
ruochen
2021/11/24
1.1K0
Java安全--Java反射机制(1)
本文属于OneTS安全团队成员mes9s0的原创文章,转载请声明出处!本文章仅用于学习交流使用,因利用此文信息而造成的任何直接或间接的后果及损失,均由使用者本人负责,OneTS安全团队及文章作者不为此承担任何责任。
OneTS安全团队
2025/02/07
1010
Java安全--Java反射机制(1)
Java反射机制:跟着代码学反射
比如人,可以抽象成一个Person类,通过new Person()来实例化一个对象;再比如鸭子,可以抽象成一个Duck类,也可以对其进行实例化……那么这一个个类本身是不是也可以抽象成一个类呢?Java提供了一个特殊的类Class,用来描述类的内部信息,是反射的核心类。
全栈程序员站长
2022/08/31
5140
相关推荐
一篇文章全面了解Java反射机制【珍藏】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验