Trouver dynamiquement la classe qui représente une primitive de type Java
J'ai besoin de faire quelques réfléchissant les appels de méthode en Java. Ces appels vous inclure des méthodes qui ont des arguments qui sont des types primitifs (int, double, etc.). La façon de spécifier les types lors de la recherche de la méthode reflectively est int.class, double.class, etc.
Le défi, c'est que je suis accepter l'entrée d'une source extérieure qui doit spécifier les types de manière dynamique. Donc, j'ai besoin de trouver ces références de Classe dynamique. Imaginez un fichier délimité par une liste de noms de méthode avec des listes de types de paramètres:
doSomething int double
doSomethingElse java.lang.String boolean
Si l'entrée était quelque chose comme java.lang.String
, je sais que je pourrais utiliser Class.forName("java.lang.String")
à cette instance de Classe en arrière. Est-il possible d'utiliser cette méthode, ou d'une autre, pour obtenir le type primitif des Classes de retour?
Edit:
Merci à tous les répondants. Il semble clair qu'il n'est pas intégrée de façon à proprement faire ce que je veux, donc je me contenterai d'en réutilisant les ClassUtils
classe du framework Spring. Il semble contenir un remplacement pour la Classe.forName() qui va travailler avec mes exigences.
Vous devez vous connecter pour publier un commentaire.
Le framework Spring contient une classe utilitaire ClassUtils qui contient la méthode statique forName. Cette méthode peut être utilisée pour la fonction exacte que vous avez décrit.
Dans le cas où vous ne voulez pas avoir une dépendance de Printemps: le le code source de la méthode peut être trouvé
e. g. icisur leur dépôt public. Le code source de la classe est sous licence Apache 2.0 modèle.Toutefois, de noter que l'algorithme utilise une codé en dur carte des types primitifs.
Edit: Grâce à des intervenants Dávid Horváth et Patrick pour souligner le lien brisé.
La
Class
cas pour les types primitifs sont obtenus comme vous l'avez dit par exemple à l'aideint.class
, mais il est également possible d'obtenir les mêmes valeurs en utilisant quelque chose commeInteger.TYPE
. Chaque primitif classe contient un champ statique,TYPE
, qui a le même primitif instance de classe.Vous ne pouvez pas obtenir la primitive de la classe via
forName
, mais vous pouvez l'obtenir à partir d'une classe qui est facilement disponible. Si vous devez absolument utiliser la réflexion, vous pouvez essayer quelque chose comme ceci:Probablement vous avez juste besoin de la carte les primitives et pour le reste de la classe effectuer le "forName" méthode:
Je ferais quelque chose comme:
Qui est, de créer une carte où les primitives types sont stockées et si la description appartenir à une primitive puis utilisez le mappé classe. Cette carte peut également être chargé à partir d'un fichier de configuration externe, pour ajouter de la flexibilité de sorte que vous ajouter une Chaîne comme un construit, au lieu de java.lang.Chaîne ou potentiellement méthode comme ceci.
"doSomething chaîne oui|non"
Il ya beaucoup de ce genre de code dans les OS des projets comme Struts, Hibernate, Spring et Apache libs ( pour n'en citer que quelques-uns ) , de sorte que vous n'avez pas besoin de démarrer à partir de zéro.
BTW. Je n'ai pas compiler le code ci-dessus, mais je suis assez sûr qu'elle fonctionne avec peu de modifications de ne pas voter de moi pour cela.
Apache Commons Lang a ClassUtils.getClass(String), qui prend en charge les types primitifs.
Un certain nombre de méthodes de la Classe ne gère pas les primitives de façon cohérente malheureusement. Une façon courante autour de cette forName est d'avoir un tableau comme;
Le code suivant parle de la façon d'obtenir la classe d'un type primitif, qui est le champ nom est connu, par exemple, dans ce cas, 'sampleInt'.
On peut aussi vérifier si une valeur est primitif ou non par l'obtention de sa classe wrapper ou valeur de champ.
Google Guava propose
com.google.common.primitives.Primitives
pour ce genre de choses.