2011-01-18 8 views
3

私は入力があります。"ListClients param1 param2" "ListClients", "param1", "param2";Java:テキストをクラスに変換する方法はありますか?

" "で分割し、私はListClientsから静的メソッドを呼び出したいです。

だから、ListClients.someMethodThatTakesPraams(param1, param2);

Javaでそれを行う方法があるのだろうか?

+2

「マジック」のおもしろタグ選択。 :D –

+1

私はそれが適用されないので、魔法のタグを削除しました –

答えて

5

はいのいくつかの例です! Class.getDeclaredMethodを使用して、名前とパラメータのタイプを指定してMethodオブジェクトをルックアップすることができます。たとえば、あなたのsomeMethodThatTakesParams方法を見つけるために、あなたはここで

Method m = ListClients.class.getDeclaredMethod("someMethodThatTakesParams", ArgType1.class, ArgType2.class); 

を書くことができ、ArgType1ArgType2は、引数の型です。

あなたがメソッドを持っていたら、次のように、あなたはそれを呼び出すことができます。

arg1arg2あなたが渡したいパラメータです
m.invoke(null, arg1, arg2); 

。メソッドが静的であるため、invokeの最初の引数はnullです。

このアプローチでは、捕捉しなければならない例外と取得しなければならないセキュリティ権限をすべて省略していますが、幸いなことにそれらを拾うのは難しくありません。

+1

+1正しい答えです。残念なことに、リフレクションはこれが簡単ではなく、利用可能なメソッドを呼び出すのを避けるためにいくつかの考慮事項を取らなければなりません。代わりに、どのメソッドを呼び出すか、呼び出すべきかを静的に記述することもできます。より多くの作業が必要ですが、より安全です。 – OscarRyz

+0

@ OscarRyz-それは優れた点です。一般的に反射は大規模な過度の攻撃です。私はOPが何をしようとしているのか分からないので、静かなディスパッチはずっと良いアイデアだと私は完全に同意するが、私はまだこの答えに立っている。 – templatetypedef

+0

その場合、あなたは私の答え:) :) :); upvoteすることができますhttp://stackoverflow.com/questions/4730009/java-is-there-a-way-to-convert-text-into-a-class/4730192#4730192 – OscarRyz

-1

Reflectionあなたの友人になります。

+0

+1私はこの投稿がdownvoteをメリットとは思わないので+1。確かにチュートリアルのリンクと説明を投稿するのは最も有用なことではありませんが。 –

+0

@Tim Bender私はそれを受け入れますが、あなたが本当に知っていなくても安全に使えるものがあります。あなたがそれらを理解していなければあなたのコードを傷つけることがあります。反射は間違いなく第2のカテゴリーに入る。さらに、私はOPが便利な全体概念の名前を見つけるだろうと思った。 – biziclop

3

はい、反射を使用できます。以下は、新しいインスタンスを作成する

ここ
Class<Object> fc = Class.forName("ListClients"); 
    Object myObj = fc.newInstance(); 

は確かinvoking methods

+0

反射を使用する必要がある場合、これはよりクリーンな答えだと思う。 – trillions

2

場合/他のチェーンを作成し、右の方法を呼び出すことであろう、単純なハードコード化された方法:これはビットantiquateを見えるかもしれませんが、あなたが正確にどのようにプログラムするので、それは、非常に安全です

String input = "ListClients param1 param2"; 
String [] args = input.split(" "); 
switch(args.length) { 
    case 0: 
     return ListClients.someMethod(); 
    case 1: 
     return ListClients.someMethod(args[0]); 
    case 2: 
     return LIstClients.someMethod(args[1]); 
    default: 
     return // something default   
} 

をコードを呼び出す必要があります。

他のソリューションは、他の人が言及としてリフレクションを使用して伴うだろう:

String input = "ListClients param1 param2"; 
String [] args = input.split(" "); 
Class[] types = new Classs[ args.length ]; 
Object[] values = new Object[ args.lenght ]; 
for(int i = 0 ; i < types.lenght ; i++) { 
    types[i] = String.class; 
    values [i] = args[i]; 
} 

ListClients.class 
    .getDeclaredMethod("someMethod", types) 
    .invoke(null, values); 

すべてのこと反射チェック例外の数に囲まれています。

あなたは、このような野生の呼び出しを防止するために何かするだろう場合は、/アプリケーションがあることをどのように動的に必要な検討とすべきである:「でSystem.exit(0)」に呼び出されまたはcode injectionの他の並べ替えを。

+0

+1のコードインジェクションリファレンス –

関連する問題