Java反射入门与反射执行Runtime示例

反射简介

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

动态特性:一段代码,改变其中的变量,将会导致这段代码产生功能性的变化。
在这里插入图片描述

获取Class的途径:

在这里插入图片描述

forName函数

正常情况下,如果想拿到一个类,需要先import引用这个类才能使用,而使用forName就不需要,这样对于攻击者来说十分有利,我们可以加载任意类。
在这里插入图片描述
forName函数第二个参数initialize=true表示类是否初始化。但是初始化的时候,构造函数是不会执行的
在这里插入图片描述

初始化方法和执行顺序

在这里插入图片描述

类名包含$符号

在这里插入图片描述

示例

main方法

package com.chaitin;

public class JavaTest {
    public static void main(String[] args) throws ClassNotFoundException {
        Class clazz = Class.forName("com.chaitin.TouchFile");//初始化时会调用static方法
    }
}

run方法

package com.chaitin;

import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            System.out.println("a");
            String[] commands = {"calc.exe"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

class.newInstance()

在这里插入图片描述

getMethod()

在这里插入图片描述

invoke()

在这里插入图片描述

反射执行Runtime示例

Class clazz = Class.forName("java.lang.Runtime");//获取Runtime类
Method execMethod = clazz.getMethod("exec", String.class);//获取exec方法
Method getRuntimeMethod = clazz.getMethod("getRuntime");//获取getRuntime方法
Object runtime = getRuntimeMethod.invoke(clazz);//执行getRuntime方法来获取Runtime实例
execMethod.invoke(runtime, "calc.exe");//通过runtime示例执行命令
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值