Si j'ai deux variables:
Object obj;
String methodName = "getName";
Sans connaître la classe de obj
, comment puis-je appeler la méthode identifiée par methodName
dessus?
La méthode appelée n'a pas de paramètres et une String
valeur de retour. C'est un getter pour un bean Java .
java
reflection
invoke
brasskazoo
la source
la source
Réponses:
Le codage de la hanche, ce serait quelque chose comme:
Les paramètres identifient la méthode très spécifique dont vous avez besoin (s'il y a plusieurs surcharges disponibles, si la méthode n'a pas d'arguments, donnez seulement
methodName
).Ensuite, vous appelez cette méthode en appelant
Encore une fois, omettez les arguments
.invoke
, si vous n'en avez pas. Mais ouais. En savoir plus sur Java Reflectionla source
method
enmethod.invoke(obj, arg1, arg2,...);
. amethod = null;
résout le problème mais le mentionner dans la réponse n'est pas une mauvaise idée.invoke
elle renverra tout ce qu'elle a renvoyé. Si une exception se produit lors de l'exécution de la méthode, l'exception sera encapsulée dans unInvocationTargetException
.Utilisez l' invocation de méthode à partir de la réflexion:
Où:
"class name"
est le nom de la classeobjectToInvokeOn
est de type Object et est l'objet sur lequel vous souhaitez appeler la méthode"method name"
est le nom de la méthode que vous souhaitez appelerparameterTypes
est de typeClass[]
et déclare les paramètres que la méthode prendparams
est de typeObject[]
et déclare les paramètres à passer à la méthodela source
Pour ceux qui veulent un exemple de code simple en Java 7:
Dog
classe:ReflectionDemo
classe:Production:
Mishka is 3 year(s) old.
Vous pouvez appeler le constructeur avec des paramètres de cette façon:
Vous pouvez également supprimer
et fait
Lecture suggérée: création de nouvelles instances de classe
la source
Method
objet?La méthode peut être invoquée comme ceci. Il y a aussi plus de possibilités (vérifiez l'api de réflexion), mais c'est la plus simple:
la source
Tout d'abord, ne le faites pas. Évitez ce type de code. Il a tendance à être très mauvais et non sécurisé (voir la section 6 des directives de codage sécurisé pour le langage de programmation Java, version 2.0 ).
Si vous devez le faire, préférez java.beans à la réflexion. Les haricots enveloppent la réflexion permettant un accès relativement sûr et conventionnel.la source
Pour compléter les réponses de mon collègue, vous voudrez peut-être porter une attention particulière à:
Voici un ancien code java1.4 qui prend en compte ces points:
la source
la source
la source
Si vous effectuez l'appel plusieurs fois, vous pouvez utiliser les nouveaux descripteurs de méthode introduits dans Java 7. Ici, nous allons pour votre méthode renvoyant une chaîne:
la source
invokeExact
chaque fois que vous le pourrez. Pour cela, la signature du site d'appel doit correspondre exactement au type de handle de méthode. Il faut généralement un peu de bricolage pour se rendre au travail. Dans ce cas, vous devez lancer le premier paramètre avec:methodHandle = methodHandle.asType(methodHandle.type().changeParameterType(0, Object.class));
puis invoquer commeString result = (String) methodHandle.invokeExact(obj);
Cela ressemble à quelque chose qui est faisable avec le package Java Reflection.
http://java.sun.com/developer/technicalArticles/ALT/Reflection/index.html
Particulièrement sous Invocation de méthodes par nom:
import java.lang.reflect. *;
la source
Indexation (plus rapide)
Vous pouvez utiliser
FunctionalInterface
pour enregistrer des méthodes dans un conteneur pour les indexer. Vous pouvez utiliser un conteneur de tableaux pour les appeler par des nombres ou une table de hachage pour les appeler par des chaînes. Par cette astuce, vous pouvez indexer vos méthodes pour les invoquer dynamiquement plus rapidement .Syntaxe lambda
Vous pouvez également utiliser la syntaxe lambda:
la source
O(1)
.SomeClass
est la classe etsomeVariable
est une variable.la source
Je fais ça comme ça:
la source
Veuillez vous référer au code suivant peut vous aider.
Merci....
la source
Voici les MÉTHODES PRÊTES À UTILISER:
Pour appeler une méthode, sans arguments:
Pour appeler une méthode, avec Arguments:
Utilisez les méthodes ci-dessus comme ci-dessous:
Production:
la source
Student.java
StudentTest.java
la source
Vous devez utiliser la réflexion - initier un objet de classe, puis une méthode de cette classe, puis invoquer cette méthode sur un objet avec des paramètres facultatifs . N'oubliez pas d'envelopper l'extrait de code suivant dans le bloc try-catch
J'espère que cela aide!
la source
Cela fonctionne bien pour moi:
}
Production:
My input testparam
Je peux invoquer la méthode en passant son nom à une autre méthode (comme main).
la source
en utilisant
import java.lang.reflect.*;
et voici comment vous l'utilisez:
la source
Avec jooR, c'est simplement:
Voici un exemple plus élaboré:
Cela imprime:
la source
pour moi, un moyen assez simple et à toute épreuve serait de simplement faire une méthode d'appel de méthode comme ceci:
puis quand vous devez appeler la méthode, mettez simplement quelque chose comme ça
la source
className.getName().toString()
? Vous manquez tout le point de réflexion.