2016-05-11 9 views
0

文字列配列を引数とする静的メソッドからなる文字列を受け取る関数を記述しようとしています。例えば私たちはそれを呼び出すことができるように静的メソッドで構成されるStringを解析するには?

、我々は静的メソッドで、このクラスを持っている想像してみましょう:次のように今

package com.stack.examples; 

public class Example { 

    public static void testMethod() { 
     System.out.println("method executed"); 
    } 
} 

、私達の機能は、別のクラスでは、次のようになります。

package com.stack.functions; 

public class Functions { 

    public void parseCommand(String command) { 
     //TODO, this is where my doubts lie 
     //The given string is always composed of a sequence of Java identifiers 
     //separated by the character ’.’, representing the full qualified name of 
      //a Java method (package.class.method) 
     command.execute(); //Would this work? Perhaps reflection would be ideal 

    } 
} 

私の目的は、解析することです

parseCommand("com.stack.examples.Example.testMethod()");

いるので parseCommandで引数として与えられた文字列

は、実際には指定された引数を持つ静的メソッドを呼び出します(この例の場合、メソッドは「メッセージが実行されました」のみを出力します)。

+0

が、私はこの質問をする前に掲示していたが、それはさえ以外の答えを持っていなかった質問の「複製」と考えられていたとして、それが自動的にシャットダウンされたパラメータ「のチェックを行きますプラグインx、コンパイラyのチェックを行ってください。 "私の質問への答えを最終的に見つけたとき、私はそれがロックされたときに答えることができませんでした。したがって、私の再開要求は聞かれていないので、私は質問を削除し、ここで私の提供された回答で再度質問しました。 – Maslor

答えて

1

は、この問題を解決するための選択肢を探した後、私はreflectionが私のために働いたことがわかった:

staticメソッドを実行する:

package test; 

public class Example { 
    public static void testMethod() { 
     System.out.println("method executed"); 
    } 
} 

メインクラス:

package test; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

public class Main { 

    public static void reflectVulnerableMethod(String str) throws ClassNotFoundException, NoSuchMethodException, SecurityException, 
        IllegalAccessException, IllegalArgumentException, InvocationTargetException { 
     String[] parts = str.split("\\."); 

     String forKlazz = ""; 
     for (int i=0; i<parts.length -1; i++) { 
      if (i != 0){ 
       forKlazz += '.' + parts[i]; 
      } 
      else forKlazz += parts[i]; 
     } 
     Class<?> klazz = Class.forName(forKlazz); 
     Method m = klazz.getMethod(parts[parts.length-1]); 


     m.invoke(null); 


    } 

    public static void main(String[] args) { 
     try { 
      reflectVulnerableMethod("test.Example.testMethod"); 
     } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException 
       | IllegalArgumentException | InvocationTargetException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+2

免責事項:Javaのような強く型付けされた言語でこれを行うことは、その設計哲学に反するので、あなたがこのようなリフレクションを悪用し始める前にあなたには非常に*良い理由があることを確かめてください。 – Kayaman

+0

これに代わる方法は何ですか?私はそれがこの問題に対する最善の答えではないように思われることに同意しますが、より実行可能な解決策を見つけることができませんでした:/ @ Kayaman – Maslor

+1

*実際の問題に依存します。あなたの問題が本当に「私は 'String'からメソッドを呼び出す必要がある」というのなら、これが解決策です。しかし、通常はオリジナルの問題があり、開発者はリフレクションを使用する方法しかないと考えています。 – Kayaman

0

使用Javaは次のように反映します。 Exampleクラスの等価な名前付きメソッドを最初に検索し、それを呼び出します。 たぶんもチェックあなたの方法はmethod.getParameters()

Method[] methods = Example.class.getMethods(); 
    for (Method method : methods) { 
     if(method.getName().equals(command)){ 
      try { 
       method.invoke(Example.class, null); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } catch (InvocationTargetException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
関連する問題