2012-02-15 14 views
9

C# es el lenguaje con el que me siento más cómodo, pero hago Java en el trabajo. Supongo que puede decir que me siento muy cómodo con el uso del Visual Studio IDE. Una de las cosas que disfruté de su depurador es que puedo poner variables de observación ("Expresiones" en Eclipse) para cualquier expresión. Así que pude echar un vistazo a los valores de campos específicos públicos o no públicos, métodos de llamada, etc. sin problemas ya que estoy depurando.¿Cómo puedo ver campos privados de otros objetos directamente en el IDE al depurar?

Parece que no puedo hacer lo mismo en Eclipse. Tengo que recurrir a llamar al método getter asociado para el campo (suponiendo que tenga uno). Si no tiene uno, o tengo que agregarlo temporalmente para poder verlo y recordar quitarlo cuando termine o simplemente soy SOL.

¿Cómo puedo poner una expresión de reloj para un objeto en uno de sus campos privados? ¿O simplemente lo estoy haciendo mal y tengo que crear expresiones especiales para verlos?
(O hay una mejor manera para mí para obtener la información que yo quiero?)

por ejemplo,

que tienen un HttpServletRequest y quieren mantener un ojo en el requestURI. Si solo miro la variable de solicitud, enumera muchos de sus campos y es demasiada información. Solo me interesa una cosa en el objeto, así que para minimizar esto, quiero agregar una expresión de reloj para esa cosa.

El nombre del campo es aparentemente requestURI, así que agregué la expresión: request.requestURI. Eclipse arroja un error que dice que no es un campo (es, simplemente no es público). En lugar de ir directamente al campo, tuve que ir al getter: request.getRequestURI() y eso funciona bien. Pero no siempre puedo contar con que el getter esté disponible.

the variables view
las variables ver

the expressions view
las expresiones vista

+1

Sin duda, puede hacerlo en cualquiera de de la IDE Netbeans/Eclipse/IntelliJ ... 1 –

+1

puramente para las capturas de pantalla;) – berry120

Respuesta

7

El eclipse evalúa la expresión teniendo en cuenta los campos privados/protegidos de Declared Type, no de Actual Type.

Ejemplo:

Number n1 = new Integer(1000); 
Integer n2 = new Integer(1000); 

expresiones:

n1.value can't be evaluate 
n2.value returns 1000, perfectly 

Una alternativa es usar DetailFormatter (clic derecho en la variable> Nueva formateador detalle).

El Eclipse utilizará esta expresión en lugar del método toString() cuando se muestre la representación textual de un objeto de tipo (en la Vista de variables, por ejemplo).

Su DetailFormatter (por ApplicationHttpRequest) puede ser:

requestURI 

o

"URI: " + requestURI + "\n" + 
"Path: " + servletPath 
+0

Ese es un punto interesante gracias por la información. Aunque es una lástima, no es lo suficientemente inteligente como para resolver esto por sí mismo. Ciertamente deberían haber sido capaces de hacerlo. –

+0

Creo que esta respuesta mejor explicó la situación. Seguro que el yeso ayuda, pero esto explica por qué es mejor. –

+0

Esta respuesta es correcta, pero no necesita un DetailFormatter para que funcione. Simplemente transfiera su objeto a su Tipo real si el campo que desea no está en su Tipo declarado y luego tome el campo. Pero no he podido hacer que funcione si tienes varias capas donde necesitas hacer esto ... – Tim

0

En Eclipse, mientras que la depuración, puede hacer clic derecho sobre una variable y haga clic en el elemento de menú del reloj. En la perspectiva de depuración, agregará una pestaña Expresiones que tendrá una lista de variables que está viendo. No estoy seguro de cómo hacerlo en los otros IDE.

+0

Sí, lo sé, pero ese no es el problema ... Quiero ver un campo privado de una variable ... Eclipse aparentemente no puede hacerlo. –

5

No importa si el campo es private o protected, las expresiones de eclipse se evaluarán correctamente. Pero el alcance de las cuestiones variables.

Corrígeme si estoy equivocado.

es un campo protegido en org.apache.catalina.core.ApplicationHttpRequest que implementa HttpServletRequest. En su caso, la variable request es del tipo HttpServletRequest e intenta acceder al HttpServletRequest.requestURI y este campo no existe y eclipse falla. Creo que es normal. Puede ser que si haces un casting adecuado, la expresión se evaluará correctamente.

+0

El tipo de objeto de solicitud es en realidad 'org.apache.catalina.connector.RequestFacade'. Pero incluso entonces, lanzarlo todavía no funciona. (esa sería una manera "fea" de resolver este "problema") –

+0

En realidad, creo que Tito tiene razón sobre los tipos. La columna 2 en su vista de variables es la columna "Valor", ¿verdad? Por lo que sé, esa columna mostrará el tipo concreto, y muestra ApplicationHttpRequest, no RequestFacade. – sharakan

+0

Ah, lo siento, ignora mi primer comentario. Mi situación actual en este momento tiene el objeto de solicitud como 'RequestFacade' (dentro de una acción struts). No me di cuenta de que no era lo mismo en mi captura de pantalla (dentro de un servlet). Tendré que volver a evaluar esto cuando tenga la oportunidad. –

1

Escribir una expresión en la vista Expresiones evalúa igual que si hubiera escrito una línea de código, y acaba de ejecutarla antes de la línea actualmente resaltada.Hay una diferencia que conozco (probablemente otros, pero esta es la más importante), que es que puede eludir las restricciones de visibilidad del acceso de clase y ver miembros privados, protegidos y predeterminados que quizás el marco de pila actual no podría.

Dicho esto, la expresión requiere que tenga el tipo correcto de referencia. Si inserta esta línea en el código, el compilador de Java se quejaría de que requestURI no es un campo de HttpServletRequest. Y, por lo tanto, debe convertir a la clase (o subclase de) que realmente declara el campo: ApplicationHttpRequest.

Ahora, por qué no se molestaron en exponer la misma magia en Expressions que en Variables donde, como usted señala, enumeran TODOS los miembros de la clase concreta incluso si el tipo declarado no los mostraba, no pude t decir.

Cuestiones relacionadas