【问题标题】:Java - How to execute user input as a method call?Java - 如何将用户输入作为方法调用执行?
【发布时间】:2017-10-19 13:01:36
【问题描述】:

我希望能够在我的 IDE 控制台中输入以下内容:

reverse("a b c d")

但目前我只能打字

a b c d 

我如何实现这一目标?我曾尝试使用 args[0],但出现错误。

public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            String sentence = sc.nextLine();
            reverse(sentence);

        }
        public static void reverse(String s){
                String [] stringArray;
                stringArray = s.split(" ");
                int counter = stringArray.length;
            for (String word : stringArray) {
                counter -=1;
                System.out.print(stringArray[counter]+" ");
            }

        }

【问题讨论】:

  • 根据您的主要方法主体,您期望一个值,并且将该值设置为方法参数
  • 我是否理解正确,您想直接调用该方法?所以不只是将参数传递给它?
  • 即使你阅读了你提到的包括方法名称在内的数据,你的反向方法体也不会给你预期的输出
  • java 反射 API 可能会帮助你,请参阅:docs.oracle.com/javase/tutorial/reflect
  • @Lino 我希望能够调用该方法并将参数传递给它。

标签: java methods java.util.scanner


【解决方案1】:

要解决您的问题,您可以使用一些正则表达式来获取 reverse("get this") 中的值:

s = s.replaceAll("reverse\\(\"(.*?)\"\\)", "$1");

第二个而不是那个循环,你可以使用StringBuilder::reverse 来反转你的字符串:

public static void reverse(String s) {
    s = s.replaceAll("reverse\\(\"(.*?)\"\\)", "$1");
    System.out.println(s);
    System.out.println(new StringBuilder(s).reverse().toString());
}

输入

reverse("a b c d")

输出

d c b a

编辑

根据您的评论:

当我运行应用程序时。它将要求用户输入。如果 用户输入:reverse("I am an apple") 然后输出: apple an am I

在这种情况下,您必须检查方法的名称,因此如果字符串以名称 reverse 开头,则例如调用反向方法:

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String sentence = sc.nextLine();

    if (sentence.startsWith("reverse")) {
        reverse(sentence);
    }
}

public static void reverse(String s) {
    s = s.replaceAll("reverse\\(\"(.*?)\"\\)", "$1");
    List<String> stringArray = Arrays.asList(s.split("\\s+"));
    Collections.reverse(stringArray);
    System.out.println(stringArray);
}

【讨论】:

    【解决方案2】:

    如果您喜欢使用 java 反射 API,请尝试以下操作:

    package Test;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Scanner;
    
    public class Example {
        public static void main(String[] args) throws InvocationTargetException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException {
            Scanner sc = new Scanner(System.in);
            String sentence = sc.nextLine();
            Class<?> c = Class.forName("Test.Example");//your package and class
                                                  //get the method to invoke
            Method  method = c.getDeclaredMethod (sentence.substring(0, sentence.indexOf("(")), String.class);
                               //get the string param
            method.invoke (c, sentence.split("\"")[1]);               
        }
        public static void reverse(String s){
            String [] stringArray;
            stringArray = s.split(" ");
            int counter = stringArray.length;
            for (String word : stringArray) {
                counter -=1;
                System.out.print(stringArray[counter]+" ");
            }
        }
        public static void doNotReverse(String s){
            System.out.print(s);
        }
    }
    

    您可以在控制台中输入reverse("a b c d")doNotReverse("a b c d")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多