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

文章目录

  • 反射简介
  • 获取Class的途径:
  • forName函数
    • 初始化方法和执行顺序
    • 类名包含$符号
    • 示例
  • class.newInstance()
  • getMethod()
  • invoke()
  • 反射执行Runtime示例

反射简介

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

动态特性:一段代码,改变其中的变量,将会导致这段代码产生功能性的变化。
Java反射入门与反射执行Runtime示例_第1张图片

获取Class的途径:

Java反射入门与反射执行Runtime示例_第2张图片

forName函数

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

初始化方法和执行顺序

Java反射入门与反射执行Runtime示例_第4张图片

类名包含$符号

Java反射入门与反射执行Runtime示例_第5张图片

示例

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

Java反射入门与反射执行Runtime示例_第6张图片

getMethod()

Java反射入门与反射执行Runtime示例_第7张图片

invoke()

Java反射入门与反射执行Runtime示例_第8张图片

反射执行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示例执行命令

你可能感兴趣的:(Java安全,java,网络安全)