2011-06-24 16 views
7

Con Eclipse es posible encontrar todas las referencias de un método, miembro o clase. ¿También es posible encontrar todas las referencias al monitor de un sincronizado?¿Cómo puedo encontrar todo sincronizado en el mismo monitor en Java con Eclipse?

Si esto no es posible con Eclipse, ¿es posible con otro Java IDE?

Mi problema es que el objeto del monitor tiene muchas referencias. Una búsqueda de todas las referencias regresará a muchos resultados. Solo veré dónde están sincronizados con este objeto.

EDIT: añadir una muestra de lo que significa:

public class LockClass{ 
    public synchronized void add(Object any){ 
    } 
} 

public class AnyOther{ 
    private LockClass lock; 

    public AnyOther(LockClass lock){ 
    this.lock = lock; 
    } 

    public void doSomethings(){ 
    synchronized(lock){ 
     //... 
    } 
} 

Ahora quiero buscar en todo sincronizado que utiliza el LockClass como monitor. Este es un análisis estático. En mi muestra Quiero encontrar:

  • LockClass.add
  • AnyOther.doSomethigs

Respuesta

1

Vamos a obtener algunos términos consecutivos:

  • El monitor de un bloque sincronizado es de hecho el monitor en un objeto
  • Referencias al monitor de un sincronizado es ambigua: es lo que desea que todos los lugares de la código al que se hace referencia a este monitor o todos los campos/variables locales que apuntan al monitor?

¿Dónde en el código se hace referencia al monitor?

Suraj ya describe cómo hacerlo: Search > References > Workspace.... También puede filtrar esas referencias a solo acceso de lectura, acceso de escritura, implementadores, etc. Dichas referencias se encuentran a través del análisis de código estático, por lo que no es necesario ejecutar la aplicación. Sin embargo, esto no detectará automáticamente los casos en los que se asigna una referencia a un objeto a un campo, que luego se asigna a otra variable. Esto solo detecta la referencia a esta referencia particular al objeto.

¿Qué variables apuntan al monitor?

Esto controlará el caso cuando varios campos/variables locales hagan referencia al objeto. Para hacer esto, la aplicación debe estar ejecutándose. Debe colocar el punto de interrupción en un lugar adecuado, donde el monitor esté visible (la manera más fácil es en algún lugar alrededor de un bloque sincronizado, que utiliza el monitor en cuestión). La vista de variables mostrará todas las variables disponibles en el alcance actual.Puede obtener todas las referencias a un objeto seleccionando una referencia al objeto en la vista Variables, llevando el menú contextual y seleccionando All References.... Esto le mostrará todos los campos/variables locales, que hacen referencia al objeto.

2

Para encontrar referencias: Select your element->rt-click menu->References->workspace

No es posible encontrar todos los posibles bloques sincronizados en el mismo objeto , porque el objeto real apuntado por una referencia dependería del tiempo de ejecución.

1

Eclipse no podrá encontrar referencias a un objeto determinado. Solo puede encontrar referencias a un cierto símbolo, p. una variable, una clase, un método a.s.o. Un monitor puede ser this o el valor de una variable o, ambos apuntando al mismo objeto en tiempo de ejecución. Sin embargo, Eclipse no tiene forma de extraer información en tiempo de ejecución como esa.

Cuestiones relacionadas