Je vais commencer par la dernière réponse à votre question si vous n'avez pas à lire les détails si vous ne souhaitez pas. Fondamentalement, c'est possible, mais avec beaucoup de questions qui doivent être répondu en premier. Si vous voulez sauter et aller directement à la billetterie, vous pouvez y aller, mais je vous recommande de lire sur.
Eclipse utilise JDI (tout en bas de cette page) pour enregistrer les points d'observation avec la JVM. Ceci est fait grâce à l' EventRequestManager
méthodes (la mise en œuvre est assurée par la JVM elle-même, pas Eclipse) qui créent des points d'observation, c'est à dire EventRequstManager.createModificationWatchpointRequest
. La seule chose que ces méthodes accepter, c'est un Field
(à noter que ce n'est pas le réfléchissants Field
de la classe). Donc, en bref, Eclipse ne peut pas le faire directement via Java. N'ayez pas peur, Java ne gère pas les points d'arrêt conditionnels soit. Ceux-ci sont également mis en œuvre par le biais de l'Éclipse directement au lieu de s'appuyer sur l'île de Java. Il ya, cependant, certaines mises en garde qui conditionner les points d'observation beaucoup plus difficile à mettre en œuvre que des points d'arrêt conditionnel.
Considérons la plaine de points d'arrêt conditionnels. Dans l'ordre pour eux de travailler, vous avez besoin d'un contexte dans lequel vous pouvez exécuter l'extrait de code. Sans un contexte d'exécution pour le code, nous ne pouvons pas évaluer l'expression/états dans l'extrait de code puisque nous n'avons aucun moyen de résoudre les variables, les valeurs, les types, etc. Cela se fait à l'aide d'un AST analyseur qui traite le code Java dans les instructions. N'oubliez pas que vous pouvez taper un certain nombre de déclarations dans un état, pas une seule expression. L'évaluateur utilise ensuite un contexte (en particulier, une IJavaStackFrame
) pour évaluer l'expression de lui-même après l'analyser.
Maintenant, pensez à conditionnelle d'un point d'observation, parce que ce dernier point est très important. Ce qui est un point d'observation du contexte d'exécution? La Variable d'accès peut se produire non seulement au sein de la même classe, mais également dans d'autres classes (pensez - protected
et le paquet de membres), et dans les classes internes ainsi (via MyClass.this.myField
). Cela signifie que:
- les variables locales ne sont jamais les mêmes depuis le champ peut être consulté à partir de plusieurs méthodes,
- les variables membres de la classe à partir de laquelle l'accès est invoquée ne sont jamais les mêmes depuis le champ peut être consulté à partir de plusieurs classes,
- les classes importées qui sont disponibles dans le contexte d'exécution ne sont jamais compatibles pour la même raison que (2), et
- l'accès du terrain en lui-même n'est jamais uniforme, car il peut exiger de qualification avec un exemple, nom de la classe,
super
ou quelque chose comme MyClass.this.myField
(à l'intérieur de la classe d'accès).
La faisabilité d'une telle fonctionnalité est plutôt limité. Vous auriez du mal à réellement évaluer une non-évolution instruction conditionnelle pour un point d'observation depuis absolument rien dans le contexte d'exécution va être cohérente. Cela signifie que le code ne peut pas être facilement analysé et interprété sans signification particulière appliquée à des morceaux de code, tels que:
myField
est toujours la même que this.myField
ou super.myField
ou MyClass.myField
ou MyClass.this.myField
, selon l'endroit où le champ est en cours d'accès.
Cela complique les choses un peu, surtout dans un système qui est déjà relativement complexe. Un exemple de point d'arrêt conditionnel code peut être trouvé ici (recherche d' getEvaluationEngine
à l'aide de Ctrl+F). Maintenant, prenez cela et ajouter dans le pré-traitement sur l'expression basée sur un ensemble de règles sur l'endroit où nous sommes et où le terrain est, et de faire les choses peuvent se compliquer.
Autant que je sache, vous ne pouvez pas faire quelque chose comme, "si l'ancienne et de la nouvelle valeur est présente, suspendre", parce que l'information n'est tout simplement pas disponible à partir de l'information que vous pouvez obtenir dans le cadre de la pile (et donc à partir du débogueur). L'expression étant attribuée à la valeur a été évaluée par le temps, le point d'observation est touché, mais son résultat n'est pas disponible pour le débogueur, il n'est donc pas à la disposition de l'évaluateur sur le site lui-même. Une étape devra être réalisée en premier lieu de la mission, alors l'expression devra être évaluée après l'étape. Ce serait horriblement sale, et honnêtement, plutôt hacky à l'.
Dans tous les cas, si vous voulez exprimer votre soutien à cette fonctionnalité, vous pouvez utiliser cette Éclipse billet. Cependant, il a été autour depuis 2005 (8 ans maintenant) et a limité le soutien de la communauté. TBH, je ne le vois pas aller très loin, surtout sans plus de précision des attentes derrière ce genre de demande de fonctionnalité et sans certaines des principales considérations de conception mettre derrière lui en premier.