2016-08-27 3 views
-1

В моей Java коде есть класс А, который имеет следующую строку:вызова метода Java с помощью Runtime.exec()

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

, где туЗЬптд поставляется пользователю вход и передается exec() во время выполнения.

Также существует общественный метод doSomething() в классе A.

Можно ли как-то вызвать doSomething() (через отражение, jdwp и т. Д.) С помощью exec() во время выполнения?

+1

Classic XY проблема. Вы хотите сделать X, но вы спрашиваете о Y. Забудьте о 'Runtime.exec()' его части и сосредоточьтесь на * проблеме. * – EJP

+0

все, что я хочу сделать, это вызвать doSomething() во время выполнения и это ** необходимо **, чтобы сделать это без внесения каких-либо изменений в существующий код. Единственное, что может быть изменено, это параметр myString, поскольку он представляет собой предоставленное пользователем значение, переданное программе во время выполнения. – qre0ct

+1

Вы не можете вызвать определенный метод извне, не написав код. Примечание: даже если вы вызываете метод, это не будет передавать объект JVM для использования в качестве состояния/контекста. Это просто вызов статического метода или вызов нового сконструированного экземпляра. –

ответ

1

Это будет означать, начиная с всего нового JVM только, чтобы позвонить методу. Если вы уже «внутри» класса A; что мешает вам напрямую вызвать doSomething()? Вероятно: только отсутствие навыков. Если да, то работайте над своими навыками; и не ходите на следующее лучшее решение, о котором вы слышали, кто-то упоминает, как это можно сделать!

В сущности: само-утверждал выродок должны всегда понять каждый и любой концепции он использует в своих программах. Если вы хотите использовать отражение, изучите, что отражение есть.

И обратите внимание: позволяя пользователям перейти в произвольных строк, что они выполняются, это огромный безопасности NO GO. Вы должны были упомянуть в своем вопросе, что вы хотите сделать это нарочно; и что вы полностью осознаете возможные последствия этого!

EDIT; учитывая ваши последние комментарии.

В этом случае решение может быть столь же просто, как:

A) вы пишете новый класс, как

public class Invoker { 
    public static void main(String[] args) { 
    A.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. Это означает, что, скорее всего, это будет совсем нет влияет на класс A в этой JVM, где вы вызываете вызов exec!

3

Запуск нового 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!"); 
    } 
} 
+0

Проблема в том, что ... это все еще не имеет смысла в контексте его вопроса. Если вы можете запустить ** дополнительный ** код внутри своей существующей JVM; то вам абсолютно не нужен обход использования рефлексии. И если он не может выполнить код в контексте своей существующей JVM, отражение также не решит его проблему. – GhostCat

+0

@GhostCat Кажется, что в OP появилась строка. И эта строка, кажется, называется методом, который он/она хочет вызвать. Так почему бы не использовать отражение? – Sweeper

+0

Я только что сказал вам: вам не нужно делать reflection.callMethod («doSomething»); вы можете просто записать «doSomething()» вместо этого. Когда вы знаете, как вызывается метод, и когда вы можете выполнять код ... вам не нужен обход рефлекса. Но, скорее всего, его требования на самом деле сложнее, но, увы, он не может их сообщить. – GhostCat