7
votes

Est-il possible d'obtenir une référence à une méthode Java pour l'invoquer plus tard?

est-il possible d'obtenir des références aux méthodes d'un objet? Par exemple, j'aimerais avoir une méthode qui invoque d'autres méthodes en tant que rappels. Quelque chose comme: xxx

est-ce possible?

EDIT: Je voulais dire des méthodes d'un objet. Je suppose que ce n'est pas possible?


2 commentaires

Vous voulez dire "méthodes d'une classe", pas "Méthodes d'un objet", non?


@skaffman: Les méthodes de la classe d'un objet. Qu'en est-il? Ceci est une distinction importante: Si vous avez une instance de classe anonyme, vous ne pouvez vous référer à la classe par nom, uniquement via appeler getclass sur l'instance. En utilisant une réflexion, vous pouvez accéder à d'autres méthodes que vous ne pouvez normalement pas accéder via l'interface de base / la classe / Enum. :-P


7 Réponses :


4
votes

Java 7 aura des fermetures qui vous laisseront faire cela.

jusqu'à ce que cela soit disponible, vous avez deux options

  • Tenez une référence à une interface avec une méthode connue sur et appelez celle-ci
  • Utilisez la réflexion pour appeler la méthode.

6 commentaires

Java 7 aura également des poignées de méthode, encore plus directes. :-P


Qu'en est-il des délégués C # -Style? Est-ce que nous obtenons ces temps?


Les fermetures ont-elles fait passer à travers Java 7?


@ CB160: Java7 May a des fermetures, ce n'est pas encore sûr de certains. Semble être plein d'espoir à ce stade, cependant.


@skaffman: Bien que rien ne soit certain, Mark Reinhold, le projet de projet pour JDK7 a annoncé à Devoxx 09 que Sun développerait des fermetures d'inclusion dans JDK7 - blogs.sun.com/mr/ientry/closures


Java 1.1 a des fermetures (verbeuse).



1
votes

Oui, vous utilisez l'API de réflexion, par exemple java.lang.class.getMethods () (et d'autres méthodes similaires sur classe ). Vous appelez une méthode méthode en utilisant méthode.invoke () .

L'API de réflexion n'est pas particulièrement agréable à utiliser, et elle porte une pénalité de performance (bien que cela soit beaucoup moins significatif qu'il n'était utilisé), mais cela fait le travail.


0 commentaires

3
votes

fonctionne contrairement à la philosophie de conception de Java. Vous êtes censé créer une classe à méthode unique et transmettre une référence à une instance de celle-ci.


1 commentaires

N'ajoute pas si nous parlons de setters d'une classe. 10 Setter + 10 getter = 20 objets pour les référencez-les d'une manière TypeAfe ne peut pas être bonne ^^ Donc, vous vous retrouvez avec des cordes et une réflexion non typées (comme dans de nombreux cadres)



3
votes

Voici un exemple de ce qui est requis pour un rappel: xxx

Si vous remettez une instance de myCallback dans quoi que ce soit.MymeThod, il imprimera tout ce que vous remettez en tant que arguments.


0 commentaires

0
votes

Via réflexion Vous pouvez accéder à des méthodes d'une classe - voir

http://java.sun.com/docs/books/tatudial/reflect/member/Methodinvocation.html

et

http://java.sun.com/j2se/ 1.5.0 / DOCS / API / Java / Lang / Reflect / Méthode.html

Cependant, vous devez transmettre une instance de cette classe ainsi que les arguments. Vous pouvez créer une simple classe wrapper, cependant, quelque chose comme xxx

soyez prudent, car cela ne fonctionnerait pas avec aucun paramètre null.


0 commentaires

2
votes

Bien que cela soit possible grâce à la réflexion, le bien meilleur bet est de passer un objet et d'y accéder via une interface le tri fonctionne actuellement (en passant dans un comparateur). Obtenir l'habitude de penser et de concevoir de cette façon est le début de la compréhension de la programmation OO.

Le faire à travers les références de méthodes conduit vers une conception globale pire - mais est évidemment plus facile pour un travail piraté unique. Si vous êtes heureux avec le piratage, utilisez simplement Groovy plutôt que toutes ces coupes courtes sont intégrées et disposent d'une syntaxe beaucoup réduite / simplifiée, vient de conçue pour un code jetable rapide au lieu d'une maintenance à long terme.


0 commentaires

8
votes

Oui, c'est possible.

Vous avez simplement la méthode Obtenir la méthode et l'invoquer.

Voici quelques échantillons de code: xxx

La question est la question, qu'est-ce que tu essayes de faire? peut-être sont de meilleurs moyens. Mais quant à votre question, la réponse est oui.


0 commentaires