繁体   English   中英

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

[英]call a java method using runtime.exec()

在我的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.class;以及A拥有的所有依赖项)。

但请记住:doSomething()在其他JVM的范围内执行。 这意味着它很可能根本不会影响您触发exec调用的JVM中的类A!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM