1

Javaでフィールド値に基づいてメソッドを呼び出すことは可能ですか? たとえば、ユーザーにどのソーダが欲しいか尋ねます。選択内容を入力し、選択内容を保持するフィールドの値を使用してメソッドを呼び出します。

明らかに、以下のコードは機能しません。しかし、それが私の意図を説明することを願っています。この種のことはJavaでも可能ですか?

目標は、IF または SWITCH ステートメントを使用せずに効果的に切り替えることです。

import java.util.Scanner;

public class FieldResolutionTest
{
     public static void main (String[] args)
     {
         Scanner inputScanner = new Scanner(System.in);
         MethodTester test = new MethodTester();

         System.out.println("Please enter ONE or TWO");
         String selection = inputScanner.nextLine();

         test.(selection)();
     }
}

public class MethodTester
{
     public void ONE()
     {
         System.out.println("You ran method ONE");
     }

     public void TWO()
     {
         System.out.println("You ran method TWO");
     }
}
4

6 に答える 6

7

リフレクションで技術的に可能ですが、既知の可能なメソッドの数が限られている場合は、switch ステートメントを使用する方がはるかに簡単です (または、Java 7 がない場合はif/ )。else

switch (selection) {
    case "ONE":
        test.ONE();
        break;
    case "TWO":
        test.TWO();
        break;
    // etc.
    default:
        System.out.println("Invalid method!");
        break;
}

メソッドが動的であるか、多くのクラスをテストしていて、それでもリフレクション ルートに進みたい場合は、次のようになります。

try {
    Method m = MethodTester.class.getMethod(selection);
    m.invoke(test);
} catch (NoSuchMethodException nsme) {
    System.out.println("Invalid method!");
}
于 2012-04-20T21:59:44.063 に答える
3

良いアプローチは次のenumとおりです。

public class FieldResolutionTest
{
  public static void main (String[] args)
  {
    Scanner inputScanner = new Scanner(System.in);

    System.out.println("Please enter ONE or TWO");
    String selection = inputScanner.nextLine();

    FieldResolutionTest.valueOf(selection).run();
  }
}

public enum MethodTester
{
  ONE { public void run()
  {
    System.out.println("You ran method ONE");
  }},
  TWO { public void run()
  {
    System.out.println("You ran method TWO");
  }};

  public abstract void run();
}
于 2012-04-20T22:05:32.720 に答える
2

リフレクションを使用できます。これは、最小限の変更を加えた例です。

import java.lang.reflect.Method;
import java.util.Scanner;

public class FieldResolutionTest {
     public static void main (String[] args) throws Exception {
         Scanner inputScanner = new Scanner(System.in);
         MethodTester test = new MethodTester();

         System.out.println("Please enter ONE or TWO");
         String selection = inputScanner.nextLine();

         Method method = MethodTester.class.getMethod(selection);
         method.invoke(test);
     }
}

class MethodTester {
     public void ONE() {
         System.out.println("You ran method ONE");
     }

     public void TWO() {
         System.out.println("You ran method TWO");
     }
}

もちろん、エラー処理を追加する必要があります。たとえば、ユーザーが次のように、許可されているメソッドの1つの名前を入力したことを確認する必要があります。

        Map<String, Method> methods = new HashMap<String, Method>();
        for (Method m: MethodTester.class.getMethods()) {
            methods.put(m.getName(), m);
        }

        if (methods.containsKey(selection)) {
            methods.get(selection).invoke(test);
        } else {
            System.err.println("No such method: " + selection);
        }
于 2012-04-20T22:07:25.793 に答える
1

入力値をテストし、対応するメソッドを呼び出す必要があります。

if(selection.equals("ONE")) test.ONE();
else if (selection.equals("ONE")) test.TWO();
else System.out.println("Unknown input!");
于 2012-04-20T22:01:00.447 に答える
1

Java 7 がリリースされてから、文字列型変数に対して switch-case メソッドを実行できるようになりました

switch(selection) {
    case "ONE":
    test.ONE();
    break;

    case "TWO":
    test.TWO();
    break;
}

繰り返しますが、Java 7 以降でのみ利用可能です。

于 2012-04-20T22:02:11.257 に答える
0

mellamokb が語ったように、リフレクションを使用してメソッドを呼び出すことができます。通常、コードは test.getClass().getMethod("ONE", null).invoke(..) のようになります。

于 2012-04-20T22:05:30.643 に答える