2017-10-13 91 views
0

如何檢查示例代碼中的getQueue()是否使用反射通用?一種方法是通過參數類型和返回類型,並檢查它們是否是TypeVariable的實例。我正在尋找更簡單的東西。如何使用反射來識別java方法是否通用?

Class SomeClass { 
<V> Queue<V> getQueue(); 
} 
+1

由於類型擦除你不能。並且記住有一個類 - 與C++模板不同 - 所以對於你的反射如何工作? –

+0

我想要獲取類/方法的元數據。我沒有看到類/方法的特定用法。我想刪除只適用於泛型的使用。 –

回答

1

你並不需要找到一個方法的參數類型或返回類型,以確定是否有類型的參數,因爲類Method有一個方法getTypeParameters返回類型參數的數組。

以下是顯示使用此方法的示例。我還在這裏展示了其他兩種方法的用法,因爲術語令人難以置信地混淆。

public class SomeClass { 

    <V, U> Queue<V> someMethod(String str, int a, List<U> list) { 
     return null; 
    } 

    public static void main(String[] args) throws Exception { 
     Method method = SomeClass.class.getDeclaredMethod("someMethod", String.class, int.class, List.class); 

     TypeVariable<Method>[] typeParameters = method.getTypeParameters(); 
     System.out.println(typeParameters.length);       // Prints "2" 
     System.out.println(typeParameters[0].getName());     // Prints "V" 

     Class<?>[] parameterTypes = method.getParameterTypes(); 
     System.out.println(Arrays.toString(parameterTypes));    // Prints [class java.lang.String, int, interface java.util.List] 

     Type[] genericParameterTypes = method.getGenericParameterTypes(); 
     System.out.println(genericParameterTypes[2].getTypeName());   // Prints java.util.List<U> 
    } 
} 
+1

非常感謝。這完美的作品:) –