群里有人问怎么实现ping的效果,作为不会写java的人,自然是不会写插件了,网上的答案都是用runtime类执行exec。调用安卓的shell(相当于win的cmd)。于是我想着既然wxbit有反射,就可以无中生有实例化出runtime对象了
这里注意实例化runtime类不是用new,而是运行静态方法 Runtime.getRuntime(),这种方法可以确保进程中只有一个runtime实例。
这里先获得方法
等同于
Class clazz = Class.forName("java.lang.Runtime"); //初始化Runtime类
Object rt = clazz.getMethod("getRuntime").invoke(clazz); (注意这里返回的是一个列表)
运行静态方法getRuntime
获得exec方法名
执行ping,这里很奇怪-c 要写在中间
这一大坨大致相当于
import jdk.internal.org.objectweb.asm.commons.Method;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
public class main {
public static void main(String[] args) throws IOException, NoSuchMethodException, ClassNotFoundException, InvocationTargetException, IllegalAccessException {
Class clazz = Class.forName("java.lang.Runtime"); //初始化Runtime类
Object rt = clazz.getMethod("getRuntime").invoke(clazz); //调用Runtime类中的getRuntime方法得到Runtime类的对象
clazz.getMethod("exec",String.class).invoke(rt,"ping 192.168.1.1"); //再次使用invoke调用Runtime类中的方法时,传递我们获得的对象,这样就可以调用
}
}
执行shell的结果会返回一个pro对象,运行pro.getInputStream(),获得inputSteam对象,然后就是处理这个玩意了 最后会制造一个回调地狱(笑
完整代码
作为只会用java写hello世界的人,相当于连爬都不会,直接学会御剑飞行了@-@