¿Cómo puedo identificar en qué contexto de Java Applet se ejecuta sin pasar una ID?

StackOverflow https://stackoverflow.com/questions/7269

  •  08-06-2019
  •  | 
  •  

Pregunta

Soy parte de un equipo que desarrolla un subprograma Java Swing bastante grande.La mayor parte de nuestro código es heredado y hay toneladas de referencias únicas.Los hemos agrupado todos en un único elemento único de "Contexto de aplicación".Lo que ahora necesitamos es crear alguna forma de separar el contexto compartido (compartido entre todos los subprogramas que se muestran actualmente) y el contexto no compartido (específico de cada subprograma que se muestra actualmente).

Sin embargo, no tenemos un ID en cada una de las ubicaciones que llaman al singleton, ni queremos propagar el ID a todas las ubicaciones.¿Cuál es la forma más sencilla de identificar en qué contexto de subprograma estamos ejecutando?(He intentado jugar con cargadores de clases, grupos de subprocesos, identificadores de subprocesos...hasta ahora no pude encontrar nada que me permita identificar el origen de la llamada).

¿Fue útil?

Solución

Los solteros son malvados, ¿qué esperas?;)

Quizás el enfoque más completo sería cargar la mayor parte del subprograma en un cargador de clases diferente (use java.net.URLClassLoader.newInstance).Luego use un WeakHashMap para asociar el cargador de clases con un subprograma.Si pudiera dividir la mayor parte del código en un cargador de clases común (como padre de cada cargador de clases por subprograma) y en el código base del subprograma normal, sería más rápido pero requeriría más trabajo.

Otros trucos:

Si tiene acceso a algún componente, puede usar Component.getParent repetidamente o SwingUtilities.getRoot.

Si está en un subproceso de instancia por subprograma, puede configurar un ThreadLocal.

Desde la EDT, puede leer el evento actual de la cola (java.awt.EventQueue.getCurrentEvent()) y posiblemente encontrar un componente a partir de ahí.Alternativamente, envíe un EventQueue con un método de despachoEvent anulado.

Otros consejos

Si le entiendo correctamente, la idea es obtener un objeto "singleton" diferente para cada objeto o "contexto" de la persona que llama.Una cosa que puedes hacer es crear una variable global local de subproceso donde escribes el ID del contexto actual.(Esto se puede hacer con AOP). Luego, en el captador singleton, el ID de contexto se obtiene del subproceso local para usarlo como clave para la instancia "singleton" correcta para el contexto de llamada.

Respecto a AOP no debería haber ningún problema en usarlo en applets ya que, dependiendo de tus puntos de corte, los consejos se tejen en tiempo de compilación y se agrega un JAR a las dependencias en tiempo de ejecución.Por lo tanto, no debe quedar ninguna evidencia especial de AOP en tiempo de ejecución.

@Hugo con respecto a threadlocal:

Pensé en esa solución.Sin embargo, a partir de experimentos encontré dos problemas con ese enfoque:

  1. Los hilos compartidos (conexiones de servidor, etc.) son problemáticos.Sin embargo, esto se puede resolver prestando especial atención a estos hilos (todos están bajo mi control y están prácticamente aislados del código heredado).
  2. El hilo EDT se comparte entre todos los subprogramas.No pude encontrar una manera de forzar la creación de un nuevo hilo EDT para cada subprograma.Esto significa que el threadlocal para el EDT se compartiría entre los subprogramas.Éste no tengo idea de cómo solucionarlo.¿Sugerencias?
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top