使用runtime.exec()调用Java方法



在我的java代码中有一个类A,它有以下行:

Process localProcess = Runtime.getRuntime().exec(myString);

其中myString是用户提供的输入,并在运行时传递给exec()

A类中还有一个公共方法doSomething()

我可以在运行时使用exec()调用doSomething()(通过反射,jdwp等)吗?

启动一个新的JVM只是为了调用一个方法?首先,这将是非常缓慢的。其次,这是完全没有必要的!

我想反射是你想要的。下面是一些示例代码:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Main {
    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
        Class<Main> c = Main.class; // First get the class
        try {
            Method method = c.getMethod("doSomething"); // get the method by its name
            method.invoke(new Main()); // call it on a new instance of Main
        } catch (NoSuchMethodException e) {
           System.out.println("Method is not found"); // print something when the method is not found
        }
    }
    public void doSomething() {
        System.out.println("I have done something!");
    }
}

这意味着启动一个全新的 JVM只是为了进行一个方法调用。如果你已经属于A类;是什么阻止你直接调用doSomething() ?可能:只是你缺乏技能。如果是,那就提高你的技能;不要去寻找你听到别人提到的下一个最好的解决方案!

本质上:一个自称的极客应该总是理解他在程序中使用的每个概念。如果你想使用反射,那么研究反射是关于什么的。

请注意:让你的用户传入任意字符串来执行它们,是一个巨大的安全性NO GO。你应该在问题中提到你是有意这样做的;而且你完全知道这样做的潜在后果!

编辑;考虑到你最近的评论。

在这种情况下,解决方案可以简单地如下:

A)你写一个新的类,比如
public class Invoker {
  public static void main(String[] args) {
    A.doSomething();

或者如果doSomething不是静态的,则需要

    A someA = new A( ... however you can create instances of A
    A.doSomething()
B)编译它,然后你可以简单地发送一个命令,如
java -cp WHATEVER Invoker

插入到现有的应用程序中。当然,你必须解决细节问题;比如为java调用提供一个有效的类路径(该类路径必须包含Invoker.class所在的位置;当然还有a级;以及A的所有依赖项)。

但是请记住:doSomething()是在不同的JVM范围内执行的。这意味着最有可能的是,它将根本不会影响JVM中的类A,在那里您触发了对exec的调用!

相关内容

  • 没有找到相关文章

最新更新