2011-04-03 50 views
3

給定一個帶有構造函數public Something(List<String> l)的類,我想使用klass.getConstructor(parameterTypes),其中parameterTypes[0]是類java.util.ArrayList(因爲我需要「匹配」給定的特定實例)而不是接口java.util.List。Java Reflection參數類型匹配,如何處理接口而不是類

這不起作用(NoSuchMethodException),因爲Java Reflection似乎需要一個EXACT類型類匹配。圍繞這個的最佳方法是什麼?

回答

0

反射只會找到實際聲明的方法。如果構造函數被聲明爲List,那麼這是唯一的構造函數。在使用反射時,沒有「匹配特定實例」這樣的概念。如果您有兩個構造函數,其中一個需要List,另一個需要ArrayList,那麼您可以通過getConstructor獲取其中一個。

我不明白爲什麼你認爲你需要這個。如果您致電newInstance,然後在聲明的List類型上使用getConstructor,則可以將其傳遞給ArrayList的實例。

+0

嗯,好,我確實需要它;)回答上面是有幫助的。 – vorburger 2011-04-04 20:39:09

+0

'Class.getMethod(Class ...)'會像編譯器一樣找到「匹配方法」。所以反思並不完全無能。我仍然困惑爲什麼Sun決定讓'getMethod(..)'使用參數匹配,但是'getConstructor(..)'不會。 – 2011-04-05 17:12:19

7

可能是矯枉過正,誠然可以拿起太多構造函數:

Constructor[] constructors = klass.getConstructors(); 
for(Constructor constructor:constructors) { 
     Class<?>[] params = constructor.getParameterTypes(); 
     if(params.length == 1 && params[0].isAssignableFrom(ArrayList.class) { 
      //Yep could be the one you want. 
     } 
} 
+0

當然是的;非常感謝你。完成在https://github.com/vorburger/vorburgers-blueprints/blob/master/appviewsnflows-core/src/main/java/ch/vorburger/appviewsnflows/util/ReflectionUtil.java FTR java.beans.ReflectionUtils有類似的東西,但不公開; http://code.google.com/p/ http://code.google.com/p/reflectutils/source/browse/trunk/src/main/java/org/azeckoski/reflectutils/ConstructorUtils.java#699 reflectutils /具有更好的版本。 – vorburger 2011-04-04 20:36:30