2017-10-13 3 views
0

Comment puis-je vérifier si getQueue() dans l'exemple de code est générique en utilisant la réflexion ?. L'one-way est de passer par les types d'argument et le type de retour et vérifiez s'ils sont l'instance de TypeVariable. Je cherche quelque chose de plus simple.Comment identifier si une méthode java est générique en utilisant la réflexion?

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

En raison de l'effacement de type vous ne pouvez pas. Et rappelez-vous qu'il existe une seule classe - contrairement aux modèles C++ -, alors pour quoi <> votre réflexion devrait-elle fonctionner? –

+0

J'essaie d'obtenir les méta-données de la classe/méthode. Je ne regarde pas une utilisation particulière de la classe/méthode. Je suppose que l'effacement ne s'applique qu'à l'utilisation de génériques. –

Répondre

1

Vous n'avez pas besoin de trouver un des types d'arguments de la méthode ou le type de retour pour identifier si les paramètres de type a, parce que la classe Method a une méthode getTypeParameters retourne un tableau des paramètres de type.

Voici un exemple montrant l'utilisation de cette méthode. J'ai également montré l'utilisation de 2 autres méthodes ici, car la terminologie est incroyablement confuse.

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

Merci beaucoup. Cela fonctionne parfaitement :) –