簡體   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