2013-08-27 4 views
0

Я пытаюсь вызвать метод process в классе образца модели, используя отражение в Java. Этот метод принимает карту строки и строки и возвращает обратно ту же самую вещь, карту строки и строки.Вызов метода с использованием отражения и возврата назад карты

Ниже мой код, но почему-то он дает мне исключение каждый раз.

Map<String, String> test = new LinkedHashMap<String, String>(); 
try { 

    test.put("CGUID", "ABCD"); 
    test.put("RESOURCEINDEX", "XYZ"); 

    Method m = SampleModel.class.getDeclaredMethod("process", Map.class); 
    Object o = m.invoke(null, test); 

} 

Это дает Object o = m.invoke(null, test); линии-я Null Pointer Exception всегда.

Может ли кто-нибудь помочь мне, что плохого я здесь делаю?

Ниже является метод signature-

@Override 
public Map<String, String> process(final Map<String, String> attributes) { 

    Map<String, String> newData = new LinkedHashMap<String, String>(); 

    for (Map.Entry<String, String> entry : attributes.entrySet()) { 
     StringBuilder sb = new StringBuilder(); 
     sb.append(entry.getValue()).append("$$$$").append(UUID.randomUUID().toString()); 
     newData.put(entry.getKey(), sb.toString()); 
    } 

    return newData; 
} 

Обновление: -

Class<SampleModel> consClass = SampleModel.class; 
      Map<String, String> test = new LinkedHashMap<String, String>(); 
      try { 

       test.put("CGUID", "ABCD"); 
       test.put("RESOURCEINDEX", "XYZ"); 

       Method m = SampleModel.class.getDeclaredMethod("process", Map.class); 
       Object o = m.invoke(consClass, test); 
} 

Приведенный выше код также не работает? Это дает мне исключение как-

object is not an instance of declaring class

+0

Является ли 'M' нуль? Как выглядит подпись 'process'? –

+0

Я только что обновил вопрос .. no m is not null .. – AKIWEB

ответ

2

Ваш метод не является статическим, то, следовательно, необходимо предоставить экземпляр при вызове invoke.

SampleModel instanceOfYourClass = ...// get an instance 
Object o = m.invoke(instanceOfYourClass, test); 

Вы могли пройти только null к invoke вызова, если метод был static. Прочтите javadoc, объяснив это here.

+0

Я обновил свой вопрос с обновленным кодом, но теперь он дает мне другое исключение. Возможно, я не делаю правильный путь. – AKIWEB

+0

@ TrekkieTechieT-T You не хотите, чтобы объект 'Class' вашего класса, вы хотите его экземпляр, что-то вроде' SampleModel instanceOfYourClass = new SampleModel() '. –

+0

Я вижу .. Да, сейчас все отлично. – AKIWEB

2

Если m.invoke(null, test) throws NullPointerException, скорее всего, метод не является статическим.

Если у вас нет возможности изменить подпись этого метода, вы должны передать экземпляр SampleModel в m.invoke вместо null.

Предполагая, что SampleModel конструктор является открытым и не имеет аргументов, и вам не нужен сам экземпляр для чего-нибудь, например:

m.invoke(new SampleModel(), test); 
Смежные вопросы