2013-08-27 96 views
0

我想在Java中使用反射在Sample Model類中調用方法process。該方法接受一個字符串和字符串的映射並返回相同的東西,一個字符串和字符串的映射。調用使用反射的方法並返回映射

下面是我的代碼,但不知怎的,它每次都給我一個例外。

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); 

} 

這LINE-Object o = m.invoke(null, test);給我Null Pointer Exception始終。

任何人都可以幫助我在這裏做什麼錯?

下面是

@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

我剛剛更新了問題..沒有m不是空的.. – AKIWEB

回答

2

你的方法也不是一成不變的,因此你需要調用invoke時提供一個實例。

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

你只能通過nullinvoke呼叫如果方法static。閱讀javadoc解釋這here

+0

我更新了我的問題與更新後的代碼,但它現在給我不同的例外..可能是我沒有做正確的方式.. – AKIWEB

+0

@ TrekkieTechieT-T你不希望你的類的'Class'對象,你想要它的一個實例,就像'SampleModel instanceOfYourClass = new SampleModel()'。 –

+0

我看到了。現在它工作正常.. – AKIWEB

2

如果m.invoke(null, test)拋出NullPointerException,最可能的process方法不是靜態的。

如果您無法更改該方法的簽名,則應將SampleModel的實例傳遞給m.invoke而不是null

假設SampleModel構造是公開的,沒有參數,你不需要實例本身的東西,像這樣:

m.invoke(new SampleModel(), test);