Java: есть ли способ конвертировать текст в класс? - PullRequest
3 голосов
/ 19 января 2011

У меня есть вход: "ListClients param1 param2", который делится на " " до "ListClients", "param1", "param2";

, и я хочу вызвать статический метод из ListClients.

Так что будет сделано ListClients.someMethodThatTakesPraams(param1, param2);

есть ли способ сделать это в Java?

Ответы [ 4 ]

5 голосов
/ 19 января 2011

Да, действительно!Вы можете использовать Class.getDeclaredMethod для поиска объекта Method с указанным именем и типами параметров.Например, чтобы найти ваш метод someMethodThatTakesParams, вы можете написать

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

Здесь ArgType1 и ArgType2 - это типы аргументов.

Как только у вас есть методВы можете вызвать его следующим образом:

m.invoke(null, arg1, arg2);

Где arg1 и arg2 - параметры, которые вы хотите передать.Обратите внимание, что первый аргумент invoke - это null, потому что метод является статическим.

Этот подход исключает все виды странностей, за исключением исключений, которые вы должны ловить, и разрешений безопасности, которые вы, возможно, должны получить, но к счастью, техне так сложно подобрать.

3 голосов
/ 19 января 2011

Да, вы можете использовать отражение. Ниже, например, создания нового экземпляра

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

Вот несколько примеров методов вызова

2 голосов
/ 19 января 2011

Простой жестко закодированный способ - создать цепочку if / else и вызвать правильный метод:

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)" любой другой вид внедрение кода .

0 голосов
/ 19 января 2011

Отражение будет твоим другом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...