Comment regarder une variable pour les changements
Je veux savoir si il y a de toute façon donc je pourrais regarder pour la variable de changement de valeur lorsque le programme est en cours d'exécution. Bien sûr, pas à l'aide du débogueur je veux le faire par programme. Par exemple:
class A
{
public static int valueToBeWatched;
}
Donc, au moment de l'exécution si, dans une méthode de classe dans mon projet modifie cette valeur MyValueChangeListner
événement doit être appelé.
- Si vous pouvez l'envelopper avec un getter/setter, ce serait facile à faire. Sinon, vous devrez utiliser un débogueur de l'API (qui est toujours programatic, mais beaucoup plus complexe).
- Disons que a=2, puis plus tard dans le programme quelqu'un fait un=2. Voulez-vous faire du son de l'alarme trop? Ou tout simplement utiliser un thread pour vérifier variable par rapport à l'ancienne valeur périodiquement?
- pouvez vous me dire débogueur API?
- +1 pour les getter et setter, puis appeler l'auditeur dans l'incubateur public, d'Avoir des variables statiques est essentiellement un mondial var. Pas une bonne pratique
- veuillez utiliser
setValueToBeWatched(int value);
et appelez votreMyValueChangeListner
.. - Comment pouvons-nous créer un wrapper? Peut-on enchaîner un int de sorte qu'il peut bu utilisé comme un int? Il n'y a pas de surcharge d'opérateur en java
- vous pouvez toujours comparer votre ancienne valeur par la nouvelle valeur transmise si vous n'avez pas envie de relancer le
Listner
.. - Comment sur la substitution Entier de définition de la&getters?
- Merci à vous tous pour la réponse je vais aller avec AspectJ.
- La présente est une copie de stackoverflow.com/questions/5401527/...
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de remplacer le type
int
avec une classe qui appelle votre auditeur à chaque fois que l'évolution des valeurs. Vous pourriez ignorer le réglage de la valeur quand elle n'a pas réellement changé.par exemple
Vous pouvez procéder à remplacer à l'aide de l'injection de code octet, mais il est beaucoup plus simple de changer le code d'origine.
Une alternative consiste à surveiller la valeur à rechercher change périodiquement. À moins que la valeur change très lentement, vous risquez de ne pas voir chaque changement. Vous pouvez utiliser le Débogueur de l'API pour le faire, mais il n'est pas simple et je ne recommande pas de l'utiliser, sauf si vous êtes familier avec l'API déjà.
Débogueur Java API Liens
http://java.sun.com/javase/technologies/core/toolsapis/jpda/
http://docs.oracle.com/javase/6/docs/technotes/guides/jpda/
http://docs.oracle.com/javase/6/docs/jdk/api/jpda/jdi/
Vous ne pouvez pas. Il n'existe pas de regarder-sur-modification crochet intégré dans Java lui-même.
Évidemment, vous pourriez faire de ce vote, si. Mais alors il ne sera pas "en direct".
AspectJ peut permettre une telle pense, mais je ne suis pas sûr qu'il tient pour des primitifs variables, ou seulement lorsque vous utilisez des getters et les setters.
Le propre de Java-façon est de faire de la variable
private
et d'utiliser les accesseurs et mutateurs.Sur une note de côté, éviter
static
chaque fois que possible. En particulierpublic
mais pasfinal
.Si vous pouvez utiliser la dernière version de Java SE JDK de Oracle, alors je suggère d'utiliser le javafx.les haricots.propriété et javafx.les haricots.valeur Api.
Voici le code de base:
Voici le résultat:
la valeur a changé de 9.0 3.0
la valeur a changé de 3.0 à 6.0
La question, comme indiqué, peut être résolu par l'écriture d'un Agent pour écouter des changements sur le terrain (voir fieldWatch). L'Agent devra être compilé à l'aide d'un C-appel-compatible de la langue, et a invoqué sur VM commencer avec un
-agentpath:<path-to-agent>=<options>
commutateur.Un niveau supérieur option est de s'attacher à un processus en cours d'exécution à l'aide de JPDA/JDI, qui encapsule l'appel ci-dessus dans un (Java) ModificationWatchpointEvent.